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

时间:2016-09-19 17:50:32

标签: java arrays sorting comparator

如何对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进行排序:

任何人都可以帮助我吗?

2 个答案:

答案 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(先排序)。

这适用于任何大小的列表和数组。