2016-04-05 19 views
2

Ich habe eine Liste einiger Zeichenfolgen. Ich muss Dubletten zusammenführen und Zähler der Duplikate hinzufügen. Zum Beispiel:Duplikate in Liste zusammenführen

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

merge und fügen Zähler

und Ausgang muss so sein:

Mom 2 
Son 2 
Dad 2 

Auch muss ich diese neue Liste sortieren, aber ich denke, dass ich gerade Sammlungen verwenden können , das zu tun.

+2

Wählerisch hier, aber muss die Ausgabe in dieser bestimmten Reihenfolge sein, oder wäre alphabetisch (oder sogar willkürlich) zulässig? – Bathsheba

+0

Und was hast du schon ausprobiert? Und warum hast du noch nichts probiert? – f1sh

+0

Im Idealfall sollte es in aufsteigender Reihenfolge sortiert werden, aber ich weiß, wie es geht. –

Antwort

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

Sie können Ihrem Code eine kleine Erklärung hinzufügen? –

+0

Ja, wenn du kannst –

1

Verwenden HashMap Duplikate halten:

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

Ich gehe davon aus, dass die Ausgabereihenfolge wurden zuerst begegnet, in welcher Reihenfolge die Schlüssel respektieren muss. Zum Glück haben die cleveren Java-Bodies dafür ein Objekt entworfen: java.util.LinkedHashMap.

So richten Sie Ihre Objektspeicher

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

Notiere die Phantasie Diamant Notation.

Dann mit name als String, schreiben Sie etwas wie

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

Dieses ein wenig optimiert werden könnte: Sie sich darauf verlassen können, dass map.get(key)null wenn key sein wird, ist nicht vorhanden. Dies beseitigt die Notwendigkeit für den Anruf containsKey.

schließlich zur Ausgabe verwenden, um Ihre Werte etwas auf den Linien von

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

Wenn Sie Ihre Ausgabe auf den Tasten sortiert werden wollen, dann stattdessen ein java.util.TreeMap verwenden. Wenn die Reihenfolge der Ausgabe für Sie keine Rolle spielt, verwenden Sie eine java.util.HashMap.

-1

Ich muss Duplikate zusammenführen und Zähler der Duplikate hinzufügen.

Wenn Duplikate in den Sinn kommen, denke an Set zu isolieren. Wenn Sie versuchen, ein zu setzendes Element hinzuzufügen, und die add-Methode false zurückgibt, drucken Sie die Daten mit 2 Zählern.

Wenn die Einträge jedoch mehr als zweimal vorkommen können, müssen Sie die Anzahl der einzelnen Einträge bis zum Ende verfolgen. Verwenden Sie stattdessen eine Karte mit jedem String als Schlüssel und dessen Anzahl als Wert. Das bedeutet im Grunde genommen, während eine Zeichenfolge zu Karte hinzufügen:

Holen Sie es aus der Karte
- wenn nicht null, dann erhalten Sie seinen Wert, erhöhen Sie 1 und setzen Sie seinen Wert erneut.
- Wenn null, dann fügen Sie es zu Karte mit Wert = 1

Am Ende können Sie Iterieren und finden Sie zählen.

Verwandte Themen