如何在java中对对象列表数组进行排序?
如何对DashboardObjectAIR对象的数组进行排序如果假设数组中的任何数组对象包含在arrray 0或1位置“UnOk”中,则它应该显示为top 对于下面的如何在java中对对象列表数组进行排序?,java,arrays,sorting,comparator,Java,Arrays,Sorting,Comparator,如何对DashboardObjectAIR对象的数组进行排序如果假设数组中的任何数组对象包含在arrray 0或1位置“UnOk”中,则它应该显示为top 对于下面的tempObj列表,airObj应该位于列表中的位置0,因为它包含“UnOk” DashboardObjectAIR[]airObj=新的DashboardObjectAIR[2]; airObj[0]=新仪表盘ObjectAir(“UnOk”); airObj[1]=新的仪表板ObjectAir(“正常”); airObj1[0]
tempObj
列表,airObj
应该位于列表中的位置0,因为它包含“UnOk”
DashboardObjectAIR[]airObj=新的DashboardObjectAIR[2];
airObj[0]=新仪表盘ObjectAir(“UnOk”);
airObj[1]=新的仪表板ObjectAir(“正常”);
airObj1[0]=新仪表板ObjectAir(“正常”);
airObj1[1]=新仪表板ObjectAir(“正常”);
List tempObj=new ArrayList();
添加临时对象(airObj);
tempObj.add(airObj1);
如何对该序列号进行排序:
有人能帮我吗?试试下面
假设数组至少有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)));
编辑-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()));
};
比较器c1=(a1,a2)->{
返回Arrays.stream(a2).map(DashboardObjectAIR::getOk).sorted().collect(Collectors.joining())
.compareTo(Arrays.stream(a1).map(DashboardObjectAIR::getOk).sorted().collect(Collectors.joining());
};
为了简单起见,我假设
仪表板ObjectAir
有一个布尔isOk()
方法,用于测试对象是“UnOk”还是“Ok”
目标是对列表进行排序
,这样包含“UnOk”仪表板objectair
对象的数组将首先进行排序
我们可以在true
之前对false
进行排序,因此如果我们可以为具有“UnOk”对象的DashboardObjectAIR[]
获取false
值,那么就很容易了
使用Java 8 Streams,我们可以通过以下方式轻松实现:
tempObj.sort(Comparator.comparing(a -> Arrays.stream(a).allMatch(DashboardObjectAIR::isOk)));
这里,我们通过检查列表中的每个元素对列表进行排序。元素被分配给类型为DashboardObjectAIR[]
的a
,然后我们检查数组的所有对象是否都是“Ok”。如果是,则返回true
(最后排序),否则返回false
(首先排序)
这将适用于任何大小的列表和数组。我们可以实现DashboardObjectAIR吗..基本上DashboardObjectAIR应该实现一个comparable,或者您可以添加一个Comparator来比较当前类中的DashboardObjectAIR类。您已经选择了需要了解的关键字:Comparator。那么,你已经知道该研究哪个主题了。你真的需要我们帮你做吗?@GhostCat你能解释一下如何实现这个吗?很简单。你转向谷歌,窗户中间有一个盒子。输入单词:“java排序比较器示例”。塔达。神奇。@GhostCat但这里的主要问题是对象数组吗?您正在静默地使用字符串降序排序的技巧,在
比较器中反转使用a2
和a1
。这是一件很容易被忽视的事情,而且可能是一个错误,所以在应用这样的技巧时,您应该始终记录(注释)。至少,您应该在回答中解释。@Andreas谢谢,将添加注释。因此请注意,任务是首先对包含“UnOk”的数组进行排序。此代码将在[Ok,UnOk]
之前对[UnOk,Ok]
进行排序,如果原始顺序保持不变,这可能是不可取的。@Andreas在Q中提到类似于元素0或1的元素包含“UnOk”,这就是为什么问题文本只是说,如果任一索引位置是“UnOk”
,则数组应显示顶部。它没有说明如果一个以上的数组符合条件该怎么办。它没有说明[UnOk,Ok]
和[Ok,UnOk]
应该如何相对排序。我只是简单地指出,您的比较器
实现总是在[Ok,Ok]
之前对[Ok,UnOk]
进行排序,而不是保留它们最初的顺序。这是否可取完全取决于OP,我只是想让OP知道。我想我们应该检查anyMatch
,因为即使数组中的一个元素包含UnOk
,它也应该出现first@Saravana这就是为什么使用allMatch()
,因为它将返回false
(先排序)如果任何isOk
调用返回false。只有当数组的所有元素isOk
时,它才会返回true并最后排序。是的,得到了它,实现将是相同的,翻转返回值,对吗?@Saravana取决于您引用的返回值allMatch(isOk)
与noneMatch(isUnOk)
相同,与相同!任意匹配(isUnOk)
。因此,如果翻转两个返回值,可以使用anyMatch()
。(前面假设数组中至少有一个元素)。
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()));
};
tempObj.sort(Comparator.comparing(a -> Arrays.stream(a).allMatch(DashboardObjectAIR::isOk)));