我想对ArrayList
个Object
nameArray = {[id:109,name:"abc"],[id:103,name:"bcd"],[id:105,name:"efg"],[id:102,name:"hij"],[id:111,name:"klm"]}
使用另一个数组
numberArray = {103,111}
现在我希望我的排序数组的顺序为
arrayAfterSort = {[id:103,name:"bcd"],[id:111,name:"klm"],... no matter other values in array can be of any order}
你能帮我用Java Comparator
。
答案 0 :(得分:1)
可能的Java 8解决方案:
nameArray.sort(Comparator.comparingInt(name -> {
int index = numberArray.indexOf(name.id);
return index == -1 ? Integer.MAX_VALUE : index;
}));
答案 1 :(得分:0)
这可以使用自定义比较器来实现。
nameArray.sort(Comparator.comparing(MyClass::getId, numberArray::indexOf)).
如果indexOf
无法找到值,则会返回-1,这些项目将在列表中排在第一位。你的问题说他们的订单并不重要,但如果你确实想要强迫他们成为最后一个,或者按照其他一些标准排序,那么,例如:
nameArray.sort(Comparator.comparing(MyClass::getId, numberArray::contains).reversed()
.thenComparing(MyClass::getId, numberArray::indexOf)
.thenComparing(MyClass::getName));
第一个比较返回一个布尔值,其自然顺序为false,需要反转。
答案 2 :(得分:0)
试试这个。
List<Name> nameArray = Arrays.asList(
new Name(109, "abc"),
new Name(103, "abc"),
new Name(105, "abc"),
new Name(102, "abc"),
new Name(111, "abc"));
List<Integer> numberArray = Arrays.asList(103, 111);
nameArray.sort(Comparator.comparing(n -> {
int index = numberArray.indexOf(n.id);
return index >= 0 ? index : Integer.MAX_VALUE;
}));
System.out.println(nameArray);
结果:
[[id:103:name:abc], [id:111:name:abc], [id:109:name:abc], [id:105:name:abc], [id:102:name:abc]]