我需要创建一个HashMap按照值的顺序打印出单词

时间:2014-03-31 20:09:04

标签: hashmap

这是我的代码到目前为止,我做错了什么?我需要创建一个HashMap <Integer,ArrayList<String>>,它会将测试数据的每个单词映射到单词的长度。然后,显示测试字符串并遍历键并显示按长度排序的单词。我不完全确定我做错了什么。我应该使用迭代器而不是for-each循环,还是会产生很大的不同?

到目前为止,这是我的代码

     HashMap<Integer,String>map = new HashMap<Integer,String>();
     // adds values
     map.put(2, "The");
     map.put(8, "Superbowl");

2 个答案:

答案 0 :(得分:1)

您应该使用SortedMap代替HashMap:&#34;一个地图,它进一步提供其键的总排序&#34; (JDK 1.7 API doc)。 TreeMap会这样做。

有序地图将按排序顺序返回其键。由于您的键是Integer(因此是Comparable),因此使用它们的自然顺序。

通过增加长度来列出单词:

SortedMap<Integer, List<String>> wordsByLength; // filled somewhere

// Iterates over entries in increasing key order
Set<Map.Entry<Integer, List<String>> entries = wordsByLength.entrySet(); 
for ( Map.Entry<Integer, List<String>> entry : entries ) {
    int length = entry.getKey();
    List<String> words = entry.getValue();
    // do what you need to do
} 

答案 1 :(得分:0)

由于订单在HashMap中没有保证,你需要拔出密钥并对它们进行排序,然后再使用排序的密钥列表循环遍历这些值:

Map<Integer,String>map = new HashMap<Integer,String>();
map.put(2, "The");
map.put(8, "Superbowl");
List<Integer> keyList = new ArrayList<Integer>(map.keySet());
Collections.sort(keyList);
for (Integer key : keyList) {
    System.out.println(map.get(key));
}

然而,在你的用例中,单词长度相同,你最终会覆盖Map中以前的条目,这可能不是你想要的。更好的解决方案是将单词存储在List中,并使用比较String长度的Comparator对它们进行排序,如下所示:

List<String> words = new ArrayList<String>();
// Loop through adding words if they don't already exist in the List

// sort the List by word length
Collections.sort(words, new Comparator<String>() {
        public int compare(String s1, String s2) {
            return Integer.valueOf(s1.length()).compareTo(s2.length());
        }
});
//Now loop through sorted List and print words
for (String word : words) {
    System.out.println(word);
}