Java 8 - >排序列表取决于其他列表

qum*_*uma 1 java sorting java-8

我有两个java.util.List,例如如下所示:

List<MyObject> myObjects = ...
MyObject myObject1 = ...
MyObject myObject2 = ...
MyObject myObject3 = ...
MyObject myObject4 = ...
MyObject myObject5 = ...
myObjects.add(myObjet1);
...
Run Code Online (Sandbox Code Playgroud)

第二个List看起来像这样:

List<MyObject> otherListObjects = ...
MyObject myObject1 = ...
MyObject myObject5 = ...
Run Code Online (Sandbox Code Playgroud)

现在我的目标是有一个列表,其中myObject1myObject5位于前两个位置,而不是其他位置.在Java 8中是否有简单的可能性?

Mur*_*nik 6

您可以myObjects根据它们出现的索引对项目进行排序myOtherObjects:

myObjects.sort(Comparator.comparingInt(s -> {
    int ind  = myOtherObjects.indexOf(s);
    if (ind >= 0) {
        return ind;
    }
    return Integer.MAX_VALUE;
}));
Run Code Online (Sandbox Code Playgroud)

Malte Hartwig提出了一个很酷的变种.它利用Java的整数运算下溢,因此,如果对象中找不到myOtherObjects,加入-1Integer.MIN_VALUE下溢,并产生2147483647:

myObjects.sort(
    Comparator.comparingInt(s -> myOtherObjects.indexOf(s) + Integer.MIN_VALUE));
Run Code Online (Sandbox Code Playgroud)

如果你不关心里面的内部订单myOtherObjects,这可以大大简化:

myObjects.sort(Comparator.comparing(myOtherObjects::contains).reversed());
Run Code Online (Sandbox Code Playgroud)