我很难理解正确的语法来排序地图哪些值不仅仅是一种类型,而是可以再次嵌套。 我会尝试在这里找到一个合适的例子:
让我们先做一个随机类:
class NestedFoo{
int valA;
int valB;
String textA;
public NestedFoo(int a, int b, String t){
this.valA = a;
this.valB = b;
this.textA = t;
}
}
好的,那是我们班的。 列表如下:
HashMap<Integer, ArrayList<NestedFoo>> sortmePlz = new HashMap<>();
让我们创建3个条目,这应该显示排序工作。
ArrayList<NestedFoo> l1 = new ArrayList<>();
n1 = new NestedFoo(3,2,"a");
n2 = new NestedFoo(2,2,"a");
n3 = new NestedFoo(1,4,"c");
l1.add(n1);
l1.add(n2);
l1.add(n3);
ArrayList<NestedFoo> l2 = new ArrayList<>();
n1 = new NestedFoo(3,2,"a");
n2 = new NestedFoo(2,2,"a");
n3 = new NestedFoo(2,2,"b");
n4 = new NestedFoo(1,4,"c");
l2.add(n1);
l2.add(n2);
l2.add(n3);
l2.add(n4);
ArrayList<NestedFoo> l3 = new ArrayList<>();
n1 = new NestedFoo(3,2,"a");
n2 = new NestedFoo(2,3,"b");
n3 = new NestedFoo(2,2,"b");
n4 = new NestedFoo(5,4,"c");
l3.add(n1);
l3.add(n2);
l3.add(n3);
l3.add(n4);
甜蜜,现在把它们放在我们的地图上。
sortmePlz.put(5,l1);
sortmePlz.put(2,l2);
sortmePlz.put(1,l3);
我现在想要的是首先按其键对整个地图进行排序,因此顺序应为l3 l2 l1。 然后,我希望每个键中的列表按以下顺序排序: intA,intB,text(全部升序)
我不知道该怎么做。尤其是Java 8以及所有那些lambdas之后,我试着阅读这个主题,但感觉不知所措。
提前致谢! 我希望代码没有语法错误,我在旅途中做了
答案 0 :(得分:3)
您可以使用TreeSet
代替常规HashMap
,您的值将按key
自动排序:
Map<Integer, ArrayList<NestedFoo>> sortmePlz = new TreeMap<>();
第二步我有点困惑。
按以下顺序排序:intA,intB,text(all ascending)
我想你想先通过比较intA
值来对列表进行排序,然后如果它们相等则比较intB
,依此类推。如果我理解正确,您可以将Comparator
与comparing
和thenComparing
一起使用。
sortmePlz.values().forEach(list -> list
.sort(Comparator.comparing(NestedFoo::getValA)
.thenComparing(NestedFoo::getValB)
.thenComparing(NestedFoo::getTextA)));
答案 1 :(得分:2)
我确信有办法用lambda做,但实际上并不是必需。请参阅 Schidu Luca 的答案,了解类似lambda的解决方案。
如果您想要“旧学校解决方案”,请继续阅读。
您无法对地图进行排序。它没有意义,因为地图中没有秩序概念。现在,有一些地图对象以排序的方式存储密钥(如 TreeMap )。
您可以订购清单。在您的情况下,使类 NestedFoo 具有可比性(https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html)。然后,您可以在列表中调用 Collections.sort (https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#sort-java.util.List-)方法。
答案 2 :(得分:1)
使用TreeMap而不是HashMap,它解决了第一个问题:按键排序。
从Map获取所需列表后,您可以按valA,valB,text排序ArrayList:
l1.sort(
Comparator.comparing(NestedFoo::getValA).thenComparing(NestedFoo::getValB).thenComparing(NestedFoo::getTextA)
);
并改变你的NestedFoo类定义:
class NestedFoo {
int valA;
int valB;
String textA;
public NestedFoo(int a, int b, String t) {
this.valA = a;
this.valB = b;
this.textA = t;
}
public int getValA() {
return valA;
}
public void setValA(int valA) {
this.valA = valA;
}
public int getValB() {
return valB;
}
public void setValB(int valB) {
this.valB = valB;
}
public String getTextA() {
return textA;
}
public void setTextA(String textA) {
this.textA = textA;
}
}
答案 3 :(得分:0)
使用treemap进行排序时请记住,treemap使用compareTo而不是equals进行排序并查找重复性。 compareTo应该在为任何将用作键的对象实现时与equals和hashcode不兼容。您可以在此链接https://codingninjaonline.com/2017/09/29/unexpected-results-for-treemap-with-inconsistent-compareto-and-equals/
上查找详细示例