我在排序数组列表时遇到问题。 在一个类中,我有两个不同对象的数组列表,我们可以调用对象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));
}
});
有没有人知道如何以有效的方式做到这一点?
答案 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因此,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
。