2016-04-05 110 views
2

我有一些字符串的列表。我需要合併dublicates並添加重複計數器。例如:合併列表中的重複項

list1.add("Mom"); 
list1.add("Mom"); 
list1.add("Son"); 
list1.add("Son"); 
list1.add("Dad"); 
list1.add("Dad"); 

合併,並添加計數器

和輸出要求是這樣的:

Mom 2 
Son 2 
Dad 2 

此外,我需要排序這個新的列表,但我想我可以只使用集合, 要做到這一點。

+2

在這裏很挑剔,但輸出是否需要按照特定的順序,或者是否允許按字母順序排列(甚至是任意的)? – Bathsheba

+0

你還嘗試過什麼?爲什麼你還沒有嘗試過任何東西? – f1sh

+0

理想情況下,它應按升序排序,但我知道如何去做。 –

回答

5
public static Map<String, Long> getValuesWithNumberOfOccurrences(
     List<String> list) { 
    return list.stream() 
       .collect(
        Collectors.groupingBy(i -> i, HashMap::new, 
        Collectors.counting())); 
} 
+0

您可以在代碼中添加一點解釋? –

+0

是的,如果可以的話 –

1

使用HashMap繼續重複:

HashMap<String, Integer> map = new HashMap<>(); 
    for (int i = 0; i < list.size(); i++) { 
     String text = list.get(i); 
     if(map.get(text) == null) { 
      map.put(text, 1); 
     } else { 
      map.put(text, map.get(text) + 1); 
     } 
    } 

    for (String text : map.keySet()) { 
     System.out.println(text + " " + map.get(text)); 
    } 
1

我假設輸出訂單需要尊重這是首次遇到的按鍵順序。幸運的是,聰明的Java bods爲此設計了一個對象:java.util.LinkedHashMap

要設置你的存儲對象使用

java.util.Map<String, Integer> map = new java.util.LinkedHashMap<>()

注意彩鑽符號。

然後,name作爲一個字符串,喜歡寫東西

if (map.containsKey(name)){ 
    map.put(key, map.get(key) + 1); 
} else { 
    map.put(key, 1); 
} 

這可以優化一點:你可以依靠的事實,map.get(key)null如果key不存在。這消除了對containsKey呼叫的需要。

最後,輸出自己的價值觀使用的東西上的

for (java.util.Map.Entry<String, Integer> entry : map.entrySet()){ 
    /*ToDo - use entry.getKey() and entry.getValue()*/ 
} 

行。如果你希望你的輸出上的按鍵進行排序,然後使用java.util.TreeMap代替。如果輸出的順序對您沒有任何影響,那麼請使用java.util.HashMap

-1

我需要合併重複項並添加重複計數器。

當想到重複的東西時,想起Set來隔離。當您嘗試添加要設置的元素並且add方法返回false時,用2計數打印數據。

但是當條目可能出現兩次以上時,則需要對每個條目的計數進行跟蹤,直到最後。因此,使用地圖來代替每個字符串作爲關鍵字並將其計數作爲值。這基本上意味着,當添加一個字符串映射:

從地圖得到它
- 如果不爲空,然後得到它的值,增量1並再次設置它的值。
- 如果爲空,則將其添加到值爲1的地圖

最後,您可以迭代並查找計數。