在我的java程序中,我得到了像
这样的结果输出:
acre care race
行动猫
预期:
行动猫acre care race
现在我想以相反的顺序对Map元素进行排序。所以我可以得到上面的结果。我在下面添加了我的代码。
public static void main(String args[]) {
try {
Scanner sc = readWords();
Map<String, List<String>> wordAnagramPairs = new HashMap<>();
wordAnagramPairs = mapAnagrams(sc);
Comparator<List<String>> c = (l1, l2) -> {
Collections.sort(l1);
Collections.sort(l2);
int in = l1.get(0).length() - l2.get(0).length();
if (in == 0) {
return String.join(" ", l1).compareTo(String.join(" ", l2));
} else {
return in;
}
};
List<List<String>> sortedList = wordAnagramPairs.values()
.stream()
.filter(li -> li != null && li.size() > 1)
.sorted(c)
.collect(Collectors.toList());
for(List<String> anagrams : sortedList){
for(String anagram : anagrams){
System.out.print(anagram + " ");
}
System.out.print('\n');
}
} catch (FileNotFoundException e) {
System.out.println("File Not Found");
}
}
答案 0 :(得分:1)
通过查看您的预期输出,您似乎需要按列表元素的长度排序,然后按长度相等的排序列表元素排序
按元素长度进行比较,然后列出元素
Comparator<List<String>> c = (l1, l2) -> {
Collections.sort(l1); // elements to be sorted
Collections.sort(l2); // elements to be sorted
int in = l1.get(0).length() - l2.get(0).length();
if (in == 0) {
return String.join(" ", l1).compareTo(String.join(" ", l2));
} else {
return in;
}
};
由于您只想要打印值,因此可以使用值
Map<String, List<String>> wordAnagramPairs = new HashMap<>();
wordAnagramPairs.put("race", Arrays.asList("race", "care", "acre"));
wordAnagramPairs.put("act", Arrays.asList("act", "cat"));
wordAnagramPairs.values().stream()
.filter(li -> li != null && li.size() > 1)
.sorted(c)
.forEach(System.out::println);
输出
[act, cat]
[acre, care, race]
收集排序结果
List<List<String>> sortedList = wordAnagramPairs.values().stream().filter(li -> li != null && li.size() > 1).sorted(c)
.collect(Collectors.toList());
System.out.println(sortedList);
您还可以使用TreeMap<String, TreeSet<String>>
按键对地图进行排序,并按设置值
按键排序
wordAnagramPairs.entrySet()
.stream()
.filter(e -> e.getValue().size() > 1)
.sorted(Map.Entry.comparingByKey())
.forEach(System.out::println);
答案 1 :(得分:1)
您可以在不使用HashMap的情况下使用TreeMap。 请参阅:http://beginnersbook.com/2014/07/how-to-iterate-treemap-in-reverse-order-in-java/
除非尝试这样:
排序地图:
Map<String, List<String>> sortedMap = new TreeMap<String, List<String>>(Collections.reverseOrder());
sortedMap .putAll(wordAnagramPairs );
排序清单:
你可以在迭代之前对循环调用进行排序。
Collections.sort(list, Collections.reverseOrder());
OR
Collections.reverse(list);