对具有深度嵌套数组的列表进行排序



我有下面的类布局,我正在尝试排序。

Class C
{
string name;
int val;
}
Class B
{
some B fields;
C[] cs; 
}
Class A
{
some A fields; 
B[] bs;
}

我必须根据C值对List<A>进行排序。条件是A1's B1's C1[n].name == A2's B2's C2[n] == "John"
然后比较并返回

C1[n].value > C2[n].value

我试过了,但它说我试图分类Cs而不是A的

List<A> listA = {// full initialized with all the values}
List<A> sortedA = listA.stream()
.flatMap(blist -> Arrays.asList(listA.getBs()).stream())
.flatMap(clist -> Arrays.asList(blist.getCs()).stream())
.sorted((c1,c2) -> {
if (c1.getName().equals(c2.getName()).compareTo("John") {
return c1.getVal() > c2.getVal()
}) 

更新样本输入和预期输出

list<A> list = { A2, A1, A3}
A2{
some A2 fields; 
B2[] b2s;  //array of B2 objects
}
B2 {
some B2 fields; 
C2[] c2s;  //array of C2 objects
}
C2 = { (John, 50), (xyz, 25)}
A1{
... B1[] b1s
}
B1 {
.... C1[] c1s
}
C1 = {(abc,55),(John,30)}
A3{
... B3[] b3s
}
B3 {
.... C3[] c3s
}
C3 = {(John,40),(def,35)}

排序前:list<A> list = { A2, A1, A3}排序后:list<A> sortedList = { A1, A3, A2}即根据他们的Cs 中John的年龄

A1.C1.John.age (30) A3.C3.John.age(40) A2.C2.John.age(50)

您似乎尝试了多次排序,但没有输入完整的排序标准。

首先创建一个比较器,它可以告诉你两个元素的排序顺序:

public class AComparator implements Comparator<A> {
public int compare​(A a1, A a2) {
// this is too simple as we do not look at null values or empty arrays
return a1.bs[0].cs[0].name.compareTo(a2.bs[0].cs[0].name);
}
}

然后使用该比较器对您的初始列表进行排序:

List<A> list = // wherever you initialize this from 
Collections.sort(list, new AComparator());

另请参阅:

  • https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Comparator.html

  • https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collections.html#sort(java.util.List,java.util.Comprator(

最新更新