2017-05-28 56 views
0

我試着收集到一個列表中的所有從我的數據庫具有相同的名稱,以便在位置,即時通訊使用該做的事:如何在我的數據庫中按名稱過濾位置?

public static List<Location> searchRepe(List<Location>ls){ 
     List<Location>res=new ArrayList<Location>(); 
     for(Location l:ls){ 
      ls.remove(l); 
if(ls.stream().anyMatch(x>x.getProvinceName().equals(l.getProvinceName()))){ 
       res.add(l);} 
      ls.add(l);  
     } 
     return res; 
    } 

錯誤:異常線程「main」 java.util.ConcurrentModificationException

我先刪除列表的位置,然後檢查是否有另一個具有相同名稱的位置。在檢查了位置名稱是否在列表中後,我將它添加到我的res列表中。在任何情況下,我會始終保持原始列表相同,因爲在檢查後,我將元素讀入列表。我知道錯誤是由於我在每次迭代中刪除並添加的,但如果在每次迭代中刪除並添加相同的元素,則列表的大小將始終相同。

有人能告訴我一個更好的方法來做到這一點?如果有可能使用java8

回答

0

foreach語句使用Iterator檢索項目,Iterator不能直接刪除項目,否則該方法將拋出ConcurrentModificationException

for (int index = 0; index < list.size(); index++) { 
    if(condition){ 
     list.remove(index); 
     index--; 
    } 
} 

在你的問題,你可以使用Multimap這是Guava圖書館新的集合類型,像這樣:

public static List<Location> searchRepe(List<Location>ls){ 
    Multimap<String,Location> locationMap = HashMultimap.create(); 
    for (Location l : ls) { 
     locationMap.put(l.getProvinceName(),l); 
    } 
    List<Location> result=new ArrayList<>(); 
    for (Map.Entry<String, Collection<Location>> entry : locationMap.asMap().entrySet()) { 
     Collection<Location> value = entry.getValue(); 
     if(value.size()>1){ 
      Location next = value.iterator().next(); 
      result.add(next); 
     } 
    } 
    return result; 
} 

注意這個,所以你可以通過下面的方法從列表中移除項行locationMap.put(l.getProvinceName(),l)put方法的結果取決於Location類中的equals方法。

0

如果你絕對想使用流和java8,我相信這是正確的解決方案。 只是過濾的ProvinceName多個

public static List<Location> searchRepe(List<Location> ls) { 

    return ls.stream() 
      .filter(
        location -> ls.stream() 
            .map(Location::getProvinceName) 
            .filter(n -> Objects.equals(n, location.getProvinceName())) 
            .count() > 1L 
      ) 
      .collect(Collectors.toList()); 
} 

或使用分組由

public static List<Location> searchRepe(List<Location> ls) { 

    return ls.stream() 
      .collect(Collectors.groupingBy(Location::getProvinceName)) 
      .entrySet() 
      .stream() 
      .map(Map.Entry::getValue) 
      .filter(entry -> entry.size() > 1) 
      .map(entry -> entry.get(1)) 
      .collect(toList()); 
} 
+0

第方法,其中基於事件的計數的所有元素的偉大工程提供了我想要的清單與所有具有位置他們的省名是共同的。第二種方法只是根據其省份名稱收集出現多次的地點。 非常感謝你Neonailol –

相關問題