如何对DashboardObjectAIR对象进行排序如果假设任何数组对象包含在arrray 0或1位置" UnOk"然后它应该显示顶部。
对于以下tempObj
列表,airObj
应位于列表中的位置0,因为它包含" UnOk"。
DashboardObjectAIR[] airObj = new DashboardObjectAIR[2];
airObj[0] = new DashboardObjectAIR("UnOk");
airObj[1] = new DashboardObjectAIR("Ok");
airObj1[0] = new DashboardObjectAIR( "Ok");
airObj1[1] = new DashboardObjectAIR("Ok");
List<DashboardObjectAIR[]> tempObj = new ArrayList<DashboardObjectAIR[]>();
tempObj.add(airObj);
tempObj.add(airObj1);
我如何对这个scnarion进行排序:
任何人都可以帮助我吗?
答案 0 :(得分:1)
尝试以下
假设数组将具有最少2个元素,如果不必添加边界检查
DashboardObjectAIR[] airObj = new DashboardObjectAIR[2];
airObj[0] = new DashboardObjectAIR("UnOk");
airObj[1] = new DashboardObjectAIR("Ok");
DashboardObjectAIR[] airObj1 = new DashboardObjectAIR[2];
airObj1[0] = new DashboardObjectAIR("Ok");
airObj1[1] = new DashboardObjectAIR("Ok");
DashboardObjectAIR[] airObj3 = new DashboardObjectAIR[2];
airObj3[0] = new DashboardObjectAIR("Ok");
airObj3[1] = new DashboardObjectAIR("Ok");
DashboardObjectAIR[] airObj4 = new DashboardObjectAIR[2];
airObj4[0] = new DashboardObjectAIR("Ok");
airObj4[1] = new DashboardObjectAIR("UnOk");
List<DashboardObjectAIR[]> listOfArray = new ArrayList<DashboardObjectAIR[]>();
listOfArray.add(airObj);
listOfArray.add(airObj1);
listOfArray.add(airObj3);
listOfArray.add(airObj4);
Comparator<DashboardObjectAIR[]> c = (a1, a2) -> {
int comp = a2[0].getOk().compareTo(a1[0].getOk()); // note a2 - a1 to have Unok before Ok
if (comp == 0)
return a2[1].getOk().compareTo(a1[1].getOk());
else
return comp;
};
List<DashboardObjectAIR[]> sorted = listOfArray.stream().sorted(c).collect(Collectors.toList());
sorted.forEach(arr -> System.out.println(Arrays.toString(arr)));
输出
[DashboardObjectAIR [ok=UnOk], DashboardObjectAIR [ok=Ok]]
[DashboardObjectAIR [ok=Ok], DashboardObjectAIR [ok=UnOk]]
[DashboardObjectAIR [ok=Ok], DashboardObjectAIR [ok=Ok]]
[DashboardObjectAIR [ok=Ok], DashboardObjectAIR [ok=Ok]]
修改-1 强>
未知大小的数组[感谢@Andreas]
Comparator<DashboardObjectAIR[]> c1 = (a1, a2) -> {
return Arrays.stream(a2).map(DashboardObjectAIR::getOk).sorted().collect(Collectors.joining())
.compareTo(Arrays.stream(a1).map(DashboardObjectAIR::getOk).sorted().collect(Collectors.joining()));
};
答案 1 :(得分:1)
为简单起见,我假设DashboardObjectAIR
有一个boolean isOk()
方法,用于测试对象是“UnOk”还是“Ok”。
目标是对List<DashboardObjectAIR[]>
进行排序,使包含“UnOk”DashboardObjectAIR
对象的数组首先排序。
我们可以使用Boolean.compareTo()
在false
之前对true
进行排序的事实,因此,如果我们可以获得false
的值DashboardObjectAIR[]
UnOk“对象,然后它会很容易。
使用Java 8 Streams,我们可以通过这种方式轻松实现:
tempObj.sort(Comparator.comparing(a -> Arrays.stream(a).allMatch(DashboardObjectAIR::isOk)));
在这里,我们通过检查列表的每个元素对列表进行排序。该元素被分配给a
类型的DashboardObjectAIR[]
,然后我们检查该数组的所有对象是否都是“Ok”。如果是,我们返回true
(排序最后),否则我们返回false
(先排序)。
这适用于任何大小的列表和数组。