2016-04-20 2 views
0

Ich habe eine HashMap Variable namens map wurden die key ein Integer ist und die value ist ein String.HashMap doppelte Werte - finden Anzahl der Duplikate

Angenommen, es gibt 100 Werte in map. Ich möchte die 100 Werte für "Donkey" suchen und dann möchte ich eine Integer mit der Anzahl der "Donkey" in map zurück, wenn es keine dann return Integer 0 sind ich versucht, eine for Schleife mit map.values() zu verwenden, aber kein Glück.

Kann mir bitte jemand einen Tipp geben?

+0

Wenn Sie eine Zählung mit "0" für nicht gefunden wollen, warum verwenden Sie ein Boxed 'Integer'-Objekt als Ergebnis, und nicht normalen' int'-Wert? – Andreas

Antwort

0

Der Collections.frequency Ansatz ist ein nett. Allerdings ist die Behauptung, dass die map.values() nicht funktioniert, ein bisschen seltsam, wie es funktionieren sollte. Ich würde hinzufügen, dass es besonders seltsam ist, da die Sammlung an die Collections.frequency die map.values() übergeben wurde.

// method to do the counting of a particular animal in a map 
static Integer countAnimal(String animal, Map<Integer, String> map) 
{ 
    int cnt = 0; 
    for (String val : map.values()) { 
     if (val.equals(animal)) { 
      ++cnt; 
     } 
    } 

    return new Integer(cnt); 
} 

public static void main(String[] args) 
{ 
    String[] animals = new String[] { "cat", "dog", "pig", "goat", "donkey", "horse", "cow" }; 

    Map<Integer, String> map = new HashMap<>(); 

    // load map for test 
    Random rnd = new Random(); 
    for (int i = 0; i < 100; ++i) { 
     String animal = animals[rnd.nextInt(animals.length)]; 
     map.put(new Integer(i), animal); 
    } 

    // count how many there are 
    Map<String, Integer> numAnimals = new HashMap<>(); 

    for (String animal : animals) { 
     numAnimals.put(animal, countAnimal(animal, map)); 
    } 

    System.out.println(numAnimals); 

    // show the cool Collections.frequency approach 
    Integer count = Collections.frequency(map.values(), "dog"); 
    System.out.println("dog: " + count); 
} 

Beispiel Ausgang:

{horse = 18, cat = 13, Esel = 23, Kuh = 15, Ziege = 17, Hund = 3, pig = 11}
Hund: 3

EDIT: ein Update, das eine Zeichenfolge ermöglicht Aufspalten der Zählung zu finden. Grundsätzlich teilt countAnimal die Zeichenfolge, die von der Karte abgerufen wird, und überprüft dann jedes Token, um festzustellen, ob es sich um ein Tier handelt. Auch der Testfall wurde leicht geändert. Es funktioniert basierend auf dem aktualisierten Kommentar. Es berücksichtigt jedoch nicht Plural. Der triviale Fall von "Katze" und "Katzen" ist leicht zu handhaben, aber "Maus" und "Mäuse" wären schwieriger und erfordern zusätzliche Arbeit.

public static void main(String[] args) 
{ 
    String[] animals = new String[] { "cat", "dog", "pig", "goat", 
      "donkey", "horse", "cow" }; 

    Map<Integer, String> map = new HashMap<>(); 

    // load map for test 
    map.put(1, "My friend has a horse"); 
    map.put(2, "A bear can be big"); // will not be found 
    map.put(3, "A cat is a loner"); 
    map.put(4, "A dog is man's best friend"); 
    map.put(5, "The cat and the dog are peacefully sleeping"); 

    // count how many there are 
    Map<String, Integer> numAnimals = new HashMap<>(); 

    for (String animal : animals) { 
     numAnimals.put(animal, countAnimal(animal, map)); 
    } 

    System.out.println(numAnimals); 
} 



static Integer countAnimal(String animal, Map<Integer, String> map) 
{ 
    int cnt = 0; 
    for (String val : map.values()) { 
     // split the val by space 
     String[] tokens = val.split("[\\s]+"); 
     for (String token : tokens) { 
      if (token.equalsIgnoreCase(animal)) { 
       ++cnt; 
      } 
     } 
    } 

    return new Integer(cnt); 
} 

Beispiel Ausgabe:

{Pferd = 1, cat = 2, Esel = 0, Kuh = 0, Ziege = 0, Hund = 2, Schwein = 0}

+0

Danke für deine Antwort, aber es ist nicht das, was ich jetzt brauche. Ich könnte das aber in einem anderen Projekt verwenden. – Maximilian

+0

@Maximilian, von Ihrem anderen Beitrag wollen Sie "Esel" in "Dieser Esel ist ein Pferd" finden. Ändern Sie in der Methode 'countAnimal'' val.equals (animal) 'in' val.toUpperCase(). Contains (animal.toUpperCase()) '. Dieser Ansatz würde einen Satzansatz behandeln.Wenn Sie aber auch "Ein Esel ist ein Esel ist ein Esel" benötigen, um 3 zurückzugeben (und nicht, ob ein bestimmter Satz das Tier überhaupt enthält), teilen Sie die Zeichenfolge durch Leerzeichen auf und übergeben Sie sie an die Methode "countAnimal". – KevinO

+0

Ich habe Ihren Code ausprobiert und anfänglich hat er mit den 'map' Werten gearbeitet, die Sie als Beispiel angegeben haben. Ich versuche jedoch, dies auf mein Programm anzuwenden und nichts zurückzugeben. Mein Programm benutzt die twitter API und ich stelle Tweets zusammen, die in einer 'HashMap' namens' textMap' gesammelt wurden. Ich weiß nicht, ob Sie Erfahrung mit der Twitter-API haben, aber wenn Sie mir helfen wollen und wollen, werde ich Ihnen meinen gesamten Code hier zur Verfügung stellen. – Maximilian

4

Try this:

int count = Collections.frequency(mapVar.values(), "Donkey"); 
System.out.println(count); 

Lassen Sie mich wissen, ob ihr gearbeitet :)

+0

Perfekt, um ein Stickler zu sein, das ist ein "int" Wert und OP will ein 'Integer', und Variable heißt' map', nicht 'mapVar'. ;-) – Andreas

+0

Ja, ich weiß :) Sorry! – geek

+0

Vielen Dank für Ihre Antwort, das funktioniert hervorragend für Einzelwortwerte. Aber für lange Saiten wird es nicht funktionieren. Zum Beispiel, wenn die Werte so aussehen: '[1 = "Dieser Esel ist ein Pferd"] ',' [2 = "Mein Freund ist ein Esel"] '. Ich weiß, dass ich meine Frage nicht richtig ausgesprochen habe. – Maximilian