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)
在单词(它被称为词典编纂):
我设法用普通的比较器搜索它们,例如只搜索数组的第一个元素,但我不知道如何搜索它们.
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仅适用于相同长度的数组.您可能需要修改它).
我有一个对象的集合(最好是某种列表)[...]现在我想根据它们的数组对对象进行排序
因为它有意义,所以Collection问题必须是保留顺序并允许你重新排序元素.就高级集合接口而言,只有List必需的属性,所以让我们假设你Collection的确是一个List.
排序a的标准方法List是使用两种Collections.sort()方法中的一种.一个要求列表元素实现Comparable,另一个更通用,要求您提供一个实现的对象Comparator,用于确定对象的所需相对顺序.
数组没有实现Comparable(这相当于说它们没有"自然顺序"),但是包含它们的对象的类可以这样做.但是,可能更好的形式是编写一个Comparator实现所需顺序的单独类,并使用该类的实例.
如果我理解正确,遵循直截了当的方法应该有效:
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)
这就是你所期待的.
| 归档时间: |
|
| 查看次数: |
2013 次 |
| 最近记录: |