# hashmap array iterrator



## Nummer6800 (24. Jan 2015)

Hallo.

Mein Script soll die Anzahl von bestimmten Worten zaehlen.
Alles funktioniert. Bis auf den Iterator.

Jeder Schluessel in meiner Hashmenge wird verglichen mit jedem Array Eintrag.
Jedesmal bei uebereinstimmung wird + eins hinzugezaehlt.

Doch der Java Compiler meckert nur ueber meinen Iterator. Als ob er ihn nicht anerkennen wuerde.
Darf man einen Iterator bei Hashmap nicht einsetzen? Wie mache ich es sonst?

for(String key : myHashMap.keySet())
??? Aber auch wenn ich das umschrieb fuer die Aufgabe, hatte ich nur Fehlermeldungen.


```
import java.util.HashMap;
import java.util.Iterator; 

public class WordCount {


  private static String[] readAndConvertInputFile() {

    // Textdatei einlesen und in String speichern


    String str = StdIn.readAll();

    // String convertieren

    String conv = str.replaceAll("\'s", "").replaceAll("[;,.:*/\\-_()\"\'\n]", " ").replaceAll(" {2,}", " ").toLowerCase();
    
    return conv.split(" ");
  }

    public static void main(String[] args)
    {
        HashMap<String,Double> myHashMap = new HashMap<String,Double>();
 

Double eins = 1.00;

	// Array erstellen:

String[] a = readAndConvertInputFile();


for (int i=0; i<a.length; i++) {

// Exemplarisches Einfügen:

        Double myDouble = myHashMap.get(a[i]);
 
        if(myDouble != null)
        {
            System.out.print("");
        }
        else
        {
            myHashMap.put(a[i], eins);
        }
}



///////// HIer mein Iterator
///////// HIer mein Iterator
///////// HIer mein Iterator

///////// Jeder Schluessel in meiner Hashmenge wird verglichen mit jedem Array.
///////// Jedesmal bei uebereinstimmung wird + eins hinzugezaehlt.
///////// 


Iterator<String> iterator = myHashMap.iterator(); // die sammlung people untersuchen

while (iterator.hasnext()) { // solange die sammlung noch weitere werte hat


for (int j=0; j<a.length; j++) {


 
        if(iterator.next()) != a[j])
        {
            System.out.print("");
        }
        else
        {
            eins = eins + 1;
            myHashMap.put(a[i], eins);
        }
}

}

/////////
/////////
///////// oder muß ich das hier dafuer benutzen:::::::


	// 
for(String key : myHashMap.keySet())
{

eins = 0.00;

for (int j=0; j<a.length; j++) {

        if(a[j] != key)
        {

            System.out.print("");

        }
        else
        {

eins = eins + 1.00;

            myHashMap.put(key, eins);

        }
}
}
	//
	//
 	//
	//

double whale = myHashMap.get("whale");
System.out.println("" + whale);

double faster = myHashMap.get("faster");
System.out.println("" + faster);

double bones = myHashMap.get("bones");
System.out.println("" + bones);


    }
}
```


----------



## Flown (24. Jan 2015)

Also ich weiß zwar nicht wieso du das so haben willst, aber das geht viel schneller und wenn du schon eine Map verwendest, dann nutze sie auch!

Du hast drei Optionen wie du an die Daten in einer Map herankommst und zwar über keySet, values, entrySet(beide Werte). Von diesen holst du dir deinen Iterator.

Hier so sollte es aussehen:

```
public static Map<String, Integer> countWords(String[] words) {
  Map<String, Integer> wordCount = new HashMap<String, Integer>();
  for (String word : words) {
    Integer occurrences = wordCount.get(word);
    wordCount.put(word, occurrences == null ? 1 : occurrences + 1);
  }
  return wordCount;
}
```


EDIT: PS: Man vergleicht Strings mit equals und nicht mit != wie hier in deinem Code

```
if(iterator.next()) != a[j])
```


----------



## Nummer6800 (24. Jan 2015)

Danke. Habe zwar nicht alles verstanden, aber ich konnte Teile deines Codes wiederverwenden und seitdem funktioniert alles wunderbar.


```
// derzeitigeswort
for (String derzeitigesw : a) {

// hier wird wohl der value wert des schluessels bekommen
Double wert = myHashMap.get(derzeitigesw);

wert = wert + 1;

myHashMap.put(derzeitigesw, wert);

}
```


----------



## Flown (24. Jan 2015)

Was machst du wenn der wert null ist?


```
occurrences == null ? 1 : occurrences + 1
```

nennt sich Tenärer Operator und sagt nichts anderes aus als, wenn occurrences null ist, dann nimm eins sonst occurrences + 1.

Was hast du denn da nicht alles verstanden?


----------



## Nummer6800 (24. Jan 2015)

Alles funktioniert. Problem geloest. ... Habe glaube ich vorher noch Double eins = 1.00; auf 0.00 gesetzt.

Ist doch egal wenn er null ist. Ich frage nur Schluessel ab die existieren. Jedenfalls alle Ergebnisse sind so wie sie sollen. 
Mit dem Methodenanfang verstehe ich immer noch nicht. Aber fuer solche schwierigeren Dinge, habe ich noch viel Zeit.


----------



## Flown (24. Jan 2015)

Die Lösung die ich dir dargeboten habe, zählt alle Wörter aus deinem Stringarray. Du brauchst vorher und nachher nichts mehr zu tun als die Zählungen auszuwerten.


----------

