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

2022-09-05 00:23:13

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

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

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]}

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

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

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


答案 1

一个不错的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);
};

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

list.sort(COMPARATOR);

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


答案 2

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

为了使它有意义,所讨论的必须是保持顺序并允许您对元素重新排序的。就高级集合接口而言,仅具有所需的属性,因此让我们假设您的确实是.CollectionListCollectionList

对 a 进行排序的标准方法是使用两种方法之一。一个需要 list 元素来实现,另一个更一般,一个要求您提供一个对象实现,用于确定对象的所需相对顺序。ListCollections.sort()ComparableComparator

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


推荐