基于另一个数组排序对象的ArrayList - Java

时间:2017-07-11 09:40:25

标签: java

我想对ArrayListObject

进行排序

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

来帮助我做到这一点

3 个答案:

答案 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]]