2016-03-03 37 views
1

有人會知道在字符串ArrayList中查找重複項並打印出重複項的最有效方法嗎?查找和打印字符串中的重複項Arraylist

比如我有一個包含一個ArrayList如下:

ArrayList<String> carLIST = new ArrayList<String>(); 
carLIST = {"Car1", "Car2", "Car3", "Car1", "Car2", "Car2"}; 

基本上什麼列表中的一次,我希望找到重複的(我覺得我已經做了以下)更多的還回一個System.out.println();顯示如下:

分享幫助:數= 2

CAR2:計數= 3

Map<String,Integer> repeatationMap = new HashMap<String,Integer>(); 
for(String str : carLIST) { 
    if (repeatationMap.containsKey(str) { 
     repeatationMap.put(str,repeatationMap.get(str) +1); 
    } 
    else { 
     epeatationMap.put(str, 1); 
    } 

// if (repeatationMap.get(str) > 1) { 
//  System.out.println(repeatationMap.entrySet()); 
// } 
} 

註釋掉的代碼是什麼,我認爲這將是打印出來的重複,但我嚴重錯誤!不知道如何在列表中打印出重複的汽車並顯示其數量。

+0

如果至少第二次滿足當前字符串,則註釋行將打印全部**映射的條目。這不是你想要的。在循環之後,您希望打印具有> 1值的條目。 –

回答

3

一旦你做填充地圖,你可以只打印條目與鍵大於1的重複,並:

for (Map.Entry<String, Integer> e : repeatationMap.entrySet()) { 
    if (e.getValue() > 1) { 
     System.out.println (e.getKey()); 
    } 
} 

注意,順便說一句,那Java的8允許你做整個計數在單個語句減少流在一個相對優雅時尚:

List<String> duplicateCars = 
    carLIST.stream() 
      .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) 
      .entrySet() 
      .stream() 
      .filter(e -> e.getValue() > 1) 
      .map(Map.Entry::getKey) 
      .collect(Collectors.toList()); 
0

的註釋部分將打印的東西不可讀對象描述。而是使用:

System.out.println(repeatationMap.get(str)); 

此外,爲避免印刷相同的字符串幾個時間創建一個布爾值設置爲跟蹤哪些字符串已經打印。用這種方法可以避免再次通過地圖循環。

如果你想顯示重複次數,你將不得不第二次循環。

相關問題