在java映射中对映射元素进行排序<;字符串,列表<;字符串>&燃气轮机;倒序
在我的java程序中,我得到的结果如下 输出: 英亩护理赛跑 扮演猫 预期: 扮演猫 英亩护理赛跑 现在我想按相反的顺序对地图元素进行排序。所以我可以得到上面的结果。我在下面添加了我的代码在java映射中对映射元素进行排序<;字符串,列表<;字符串>&燃气轮机;倒序,java,string,Java,String,在我的java程序中,我得到的结果如下 输出: 英亩护理赛跑 扮演猫 预期: 扮演猫 英亩护理赛跑 现在我想按相反的顺序对地图元素进行排序。所以我可以得到上面的结果。我在下面添加了我的代码 public static void main(String args[]) { try { Scanner sc = readWords(); Map<String, List<String>> wordAnagramPairs = new
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");
}
}
publicstaticvoidmain(字符串参数[]){
试一试{
Scanner sc=readWords();
Map wordAnagramPairs=newhashmap();
wordAnagramPairs=地图图(sc);
比较器c=(l1,l2)->{
集合。排序(l1);
集合。排序(l2);
int in=l1.get(0.length()-l2.get(0.length();
如果(in==0){
返回String.join(“,l1).compareTo(String.join(“,l2));
}否则{
返回;
}
};
List sortedList=wordAnagramPairs.values()
.stream()
.filter(li->li!=null&&li.size()>1)
.已分类(c)
.collect(Collectors.toList());
用于(列表字谜:sortedList){
for(字符串字谜:字谜){
系统输出打印(字谜+“”);
}
系统输出打印('\n');
}
}catch(filenotfounde异常){
System.out.println(“未找到文件”);
}
}
通过查看预期输出,似乎需要按列表元素的长度排序,如果长度相等,则需要按排序后的列表元素排序
按元素长度进行比较,然后列出元素
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;
}
};
收集已排序的结果
List<List<String>> sortedList = wordAnagramPairs.values().stream().filter(li -> li != null && li.size() > 1).sorted(c)
.collect(Collectors.toList());
System.out.println(sortedList);
您可以在不使用HashMap的情况下使用TreeMap。 请参阅: 除非像这样尝试: 要对地图进行排序,请执行以下操作:
Map<String, List<String>> sortedMap = new TreeMap<String, List<String>>(Collections.reverseOrder());
sortedMap .putAll(wordAnagramPairs );
或
使用
TreeMap
而不是HashMap
我尝试了这两种解决方案,但仍然不起作用。这是同样的结果。你试过第一个比较器了吗?查看输出,它与您的预期输出匹配。在问题中添加所有输入,同时提及哪一个不工作,我尝试的比较器似乎工作正常。但是如果我删除.forEach(System.out::println)代码>结果更改。你能告诉我为什么会这样吗?forEach
是一个终端操作,我们需要的工作流应该有终端操作符。添加了一个collect
来收集已排序的列表。用collect检查更新的答案
List<List<String>> sortedList = wordAnagramPairs.values().stream().filter(li -> li != null && li.size() > 1).sorted(c)
.collect(Collectors.toList());
System.out.println(sortedList);
wordAnagramPairs.entrySet()
.stream()
.filter(e -> e.getValue().size() > 1)
.sorted(Map.Entry.comparingByKey())
.forEach(System.out::println);
Map<String, List<String>> sortedMap = new TreeMap<String, List<String>>(Collections.reverseOrder());
sortedMap .putAll(wordAnagramPairs );
Collections.sort(list, Collections.reverseOrder());
Collections.reverse(list);