java 使用Guava Ordering基于在另一个列表上定义的比较器对列表进行排序

5f0d552i  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(114)

我有两个相同大小的列表:List<A>listAList<B>listB,它们彼此完全独立。
我想根据listB中元素的移动方式对listA进行排序。
假设两个列表之间存在一个假想的连接。
例如:

listA = [a,b,c,d,e]
         | | | | |
listB = [j,g,h,k,i]

如果listB的比较器按字典顺序对它进行排序,则listA应该是b,c,e,a,d

listA = [b,c,e,a,d]
         | | | | |
listB = [g,h,i,j,k]

我不想创建一个同时封装AB的类。
我遇到了Ordering.explicit(),但无法弄清楚。

private static  class ComparatorB implements Comparator<B> {
    @Override
    public int compare(B left, B right) {
      
    }
        
    }

Ordering<B> ordering = Ordering.from(new ComparatorB());

我不知道该传递什么给sort方法。listA.sort(????)

db2dz4w8

db2dz4w81#

这个怎么样?

listB.sort(new ComparatorB());
listA.sort(Ordering.explicit(listB)); // or possibly a mapped version

或者,如果你想把一个B比较器变成一个A比较器,你可以这样做

listA.sort(Ordering.from(new ComparatorB()).onResultOf(a -> mapAtoB(a)))

问题更新后更新
你可以这样做:

Streams.zip(listA.stream(), listB.stream(), Pair::new)
                .sorted(Ordering.from(new ComparatorB()).onResultOf(Pair::getFirst))
                .map(Pair::getSecond)
                .collect(Collectors.toList());

我不确定您是否会将Pair视为“创建一个封装A和B的类”,但不清楚为什么您不希望这样做。这可能是你最好的选择。

相关问题