基于Java中另一个arraylist中的对象值对arraylist进行排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Java中另一个arraylist中的对象值对arraylist进行排序相关的知识,希望对你有一定的参考价值。

我有一个排序数组列表的问题。在一个类中,我有两个不同对象的数组列表,我们可以调用对象Foo和Bar。

public class Foo() {
   int value;
   //Some other fields, and setters and getters.
}

public class Bar() {
   int id;
   //Same here...
}

所以列表fooList可以完全被删除。假设我有16个Foos,但值为5的Foo可以在索引13上,依此类推。

我想要做的是命令barList匹配这些值后的fooList。如果值为5的Foo在索引13上,我想要值为5的Bar在索引13上。我的最后一次尝试是这样,但没有成功。

HashMap<Integer, Integer> positions = new HashMap<>();
for(int i=0;i<fooList.size();i++){
    positions.put(foo.get(i).getValue, i);
}
Collections.sort(barList, new Comparator<Bar>(){
    public int compare(Bar obj1, Bar obj2){
        return positions.get(barList.indexOf(obj1)) -
 positions.get(barList.indexOf(obj2));
    }
});

有没有人知道如何以有效的方式做到这一点?

答案

我不确定你为什么要使用barList中元素的索引来查看地图positions

这应该对你有帮助

Collections.sort(barList, new Comparator<Bar>() {
    @Override
    public int compare(Bar o1, Bar o2) {
        return positions.get(o1.getId()) - positions.get(o2.getId());
    }
});

这可以通过单线程简化

Collections.sort(barList, Comparator.comparingInt(bar -> positions.get(bar.getId())));

基本上,问题归结为:

给定两个整数列表A = {a1,a2 ... an}和B = {b1,b2,... bm},根据第一个列表中元素出现的位置A对列表B进行排序。

对于B中的两个元素x,y

  • x> y,如果x出现在y之前。
  • x <y,如果x出现在y之后。
  • x = y,如果x = y

因此,Bar的比较器函数必须比较特定元素在Foo中出现的位置(基于上述)。

注意:这假设(如你所说)Bar中没有Foo中没有的元素。 (Bar中的元素是Foo中元素的子集)。

另一答案

我首先在值上索引barList的项目,以便能够快速找到具有适当值的Bar实例。然后用它将fooList变换成新的barList。一些事情:

Map<Integer, Bar> barMap = barList
    .stream()
    .collect(Collectors
        .toMap(
            Bar::getValue,
            Function.identity());
barList = fooList
    .stream()
    .map(Foo::getValue)
    .map(barMap::get)
    .collect(Collectors.toList());

我认为这必须是时间上最优的。在记忆中,你必须在这里建立一个barMap

以上是关于基于Java中另一个arraylist中的对象值对arraylist进行排序的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何在java中使用布尔值对ArrayLists进行排序?

Java中请说明集合类ArrayList与 HashMap的区别?

从向量中删除对象会破坏 C++ 中另一个对象中的对象

android中的键值对

java:我想使用键值对,并且键或者值可以重复,在java中找得到对应的类吗?

reduce 阶段遍历对象添加到ArrayList中的问题