简体   繁体   中英

How can I use a string array as key in hash map?

I've made an String array out of a .txt and now want to make a HashMap with this string as key. But I don't want to have the String as one key to one value, I want to have each Information as a new key for the HashMap.

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

So the information in the string is like ("word", "thing", "etc.", "pp.", "thing").

My value should be the frequency of the word in the text. So for example key: "word" value: 1, key: "thing" value: 2 and so on... I'm clueless and would be grateful if someone could help me, at least with the key. :)

You can create a Map while using the String value at each array index as the key, and an Integer as the value to keep track of how many times a word appeared.

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

Then when you want to increment, you can check if the Map already contains the key, if it does, increase it by 1, otherwise, set it to 1.

if (occurences.containsKey(word)) {
    occurences.put(word, occurences.get(word) + 1);
} else {
    occurences.put(word, 1);
}

So, while you are looping over your string array, convert the String to lower case (if you want to ignore case for word occurrences), and increment the map using the if statement above.

for (String word : words) {
    word = word.toLowerCase(); // remove if you want case sensitivity
    if (occurences.containsKey(word)) {
        occurences.put(word, occurences.get(word) + 1);
    } else {
        occurences.put(word, 1);
    }
}

A full example is shown below. I converted to words to lowercase to ignore case when using the key in the map, if you want to keep case, remove the line where I convert it to lowercase.

public static void main(String[] args) {

    String s = "This this the has dog cat fish the cat horse";
    String[] words = s.split(" ");
    Map<String, Integer> occurences = new HashMap<String, Integer>();

    for (String word : words) {
        word = word.toLowerCase(); // remove if you want case sensitivity
        if (occurences.containsKey(word)) {
            occurences.put(word, occurences.get(word) + 1);
        } else {
            occurences.put(word, 1);
        }
    }

    for(Entry<String,Integer> en : occurences.entrySet()){
        System.out.println("Word \"" + en.getKey() + "\" appeared " + en.getValue() + " times.");
    }

}

Which will give me output:

Word "cat" appeared 2 times.
Word "fish" appeared 1 times.
Word "horse" appeared 1 times.
Word "the" appeared 2 times.
Word "dog" appeared 1 times.
Word "this" appeared 2 times.
Word "has" appeared 1 times.

Yes, you can use an array (regardless of element type) as a HashMap key.

No, shouldn't do so. The behavior is unlikely to be what you want (in general).

In your particular case, I don't see why you even propose using an array as a key in the first place. You seem to want String s drawn from among your array elements as keys.

You could construct a word frequency table like so:

Map<String, Integer> computeFrequencies(String[] words) {
    Map<String, Integer> frequencies = new HashMap<String, Integer>();

    for (String word: words) {
        Integer wordFrequency = frequencies.get(word);

        frequencies.put(word,
                (wordFrequency == null) ? 1 : (wordFrequency + 1));
    }

    return frequencies;
}

In java 8 using stream

String[] array=new String[]{"a","b","c","a"};
Map<String,Integer> map1=Arrays.stream(array).collect(Collectors.toMap(x->x,x->1,(key,value)->value+1));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM