基于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的区别?