如何在java中对对象列表数组进行排序?

如何在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]

如何对DashboardObjectAIR对象的数组进行排序如果假设数组中的任何数组对象包含在arrray 0或1位置“UnOk”中,则它应该显示为top

对于下面的
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)));