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

时间:2018-02-28 17:07:00

标签: java sorting 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));
    }
});

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

2 个答案:

答案 0 :(得分:1)

我不确定您为什么要使用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())));

这可以通过单线

进行简化
Bar

基本上,问题归结为:

给定两个整数列表A = {a 1 2 ... a n },B = {b 1 ,b 2 ,... b m },根据第一个列表中元素出现的位置对列表B进行排序,A

对于B

中的两个元素 x y
  • x&gt; y ,如果 x 出现在A的 y 之前。
  • x&lt; y ,如果 x 出现在A中的 y 之后。
  • x = y ,如果 x = y

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

注意:这假设(正如您所说)Foo中{strong}}中没有无元素 Bar。 (Foo中的元素是while)中元素的子集。

答案 1 :(得分:0)

我首先索引值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