这是我的代码到目前为止,我做错了什么?我需要创建一个HashMap
<Integer,ArrayList<String>>
,它会将测试数据的每个单词映射到单词的长度。然后,显示测试字符串并遍历键并显示按长度排序的单词。我不完全确定我做错了什么。我应该使用迭代器而不是for-each循环,还是会产生很大的不同?
到目前为止,这是我的代码
HashMap<Integer,String>map = new HashMap<Integer,String>();
// adds values
map.put(2, "The");
map.put(8, "Superbowl");
答案 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);
}