如何在集合中对数组进行排序?

Mai*_*fer 12 java sorting collections

我有一个对象列表.那些对象(以及其他)有一个私有的int数组(如果有帮助,我可以将它转移到List中).这个数组有一个公共Getter.所有阵列大小相同.

我想根据它们的数组对Object进行排序,如下所示:

Unsorted:
{[0, 1, 4, 5], 
 [0, 0, 2, 3],
 [0, 1, 1, 2]}

Sorted:
{[0, 0, 2, 3],
 [0, 1, 1, 2],
 [0, 1, 4, 5]}
Run Code Online (Sandbox Code Playgroud)

在单词(它被称为词典编纂):

  • 比较每个数组的第一个int
  • 如果它们相等,则比较每个数组的下一个int(依此类推)
  • 如果它们不相等,则比较的结果是最终结果.

我设法用普通的比较器搜索它们,例如只搜索数组的第一个元素,但我不知道如何搜索它们.

Pau*_*ton 12

一个很好的Java 8解决方案是

static final Comparator<CustomObject> COMPARATOR = (o1, o2) -> {
    int[] arr1 = o1.getArray();
    int[] arr2 = o2.getArray();
    return IntStream.range(0, arr1.length)
                    .map(i -> Integer.compare(arr1[i], arr2[i]))
                    .filter(i -> i != 0)
                    .findFirst()
                    .orElse(0);
};
Run Code Online (Sandbox Code Playgroud)

然后,给List<CustomObject>你一个,你可以做到

list.sort(COMPARATOR);
Run Code Online (Sandbox Code Playgroud)

(Comparator仅适用于相同长度的数组.您可能需要修改它).

  • @KedarMhaswade不,它会短路,你可以坚持"偷看"来检查你是否不相信我. (7认同)

Joh*_*ger 8

我有一个对象的集合(最好是某种列表)[...]现在我想根据它们的数组对对象进行排序

因为它有意义,所以Collection问题必须是保留顺序并允许你重新排序元素.就高级集合接口而言,只有List必需的属性,所以让我们假设你Collection的确是一个List.

排序a的标准方法List是使用两种Collections.sort()方法中的一种.一个要求列表元素实现Comparable,另一个更通用,要求您提供一个实现的对象Comparator,用于确定对象的所需相对顺序.

数组没有实现Comparable(这相当于说它们没有"自然顺序"),但是包含它们的对象的类可以这样做.但是,可能更好的形式是编写一个Comparator实现所需顺序的单独类,并使用该类的实例.


Ked*_*ade 6

如果我理解正确,遵循直截了当的方法应该有效:

public class SortArrays {

    public static void main(String[] args) {
        List<int[]> listOfArrays = new ArrayList<>(4);
        listOfArrays.add(new int[]{0, 1, 4, 5});
        listOfArrays.add(new int[]{0, 0, 2, 3});
        listOfArrays.add(new int[]{0, 1, 1, 2});
        Collections.sort(listOfArrays, (o1, o2) -> {
            for (int i = 0; i < o1.length; i++) {
                if (o1[i] < o2[i])
                    return -1;
                if (o1[i] > o2[i])
                    return 1;
            }
            return 0;
        });
        listOfArrays.forEach(a -> System.out.println(Arrays.toString(a)));
    }
}
Run Code Online (Sandbox Code Playgroud)

它产生:

[0, 0, 2, 3]
[0, 1, 1, 2]
[0, 1, 4, 5]
Run Code Online (Sandbox Code Playgroud)

这就是你所期待的.