我有两个列表,其中列表A有一些项目,列表B具有可以用于重新排列列表A的有序值。
列表A = [X,A,Y,B,C,D,E,F],
列表B = [D,B,A]
我需要得到的结果:
结果:[X, D ,Y, B ,C, A ,E,F]。
如您所见,按照列表B中提到的元素,列表A的元素被交换和排序。
我们可以使用java比较器来实现吗?还是有最快的方法吗?
在实际情况下,
列表A包含A的对象,列表B包含该对象的mongoId。
class A{
string mongoId;
string name;
//getters and setters
}
答案 0 :(得分:0)
对于比较器而言并非如此。我的想法是建立一个映射,将列表B的值作为键,并将它们在列表A中的索引作为值。然后浏览该地图,您可以在列表A中进行适当的切换
答案 1 :(得分:0)
尝试以下功能。
在这里,我假设列表B将是列表A的完整子集。如果不是这种情况,则需要过滤列表B,以便删除所有MongoIds
中不存在的{清单A。
说明:迭代列表A
,并检查当前元素是否是列表B
的一部分。如果是,请获取列表B
的第一个元素,并在列表A
中找到其索引。假设您在索引b0
上找到它。之后,您可以将迭代中的列表A
的当前元素替换为a[b0]
的元素。之后,您可以对列表A
的所有其他元素重复此练习,您可以在列表mongoId
中找到其B
。
注意:每次在列表mongoId
中找到B
时,都必须增加swap
的计数才能获得列表B
的下一个元素。
public static List<A> mySort(List<A> a, List <String> b){
final int[] swap=new int[1];
swap[0]=0;
List<A> newl = new ArrayList<>();
for(int i=0; i<a.size(); i++){
if(b.contains(a.get(i).getMongoId())){
A temp= a.stream().filter(f->f.getMongoId().equals(b.get(swap[0]))).findFirst().get();
int index=a.indexOf(temp);
newl.add(a.get(index));
swap[0]++;
} else {
newl.add(a.get(i));
}
}
return newl;
}
我也测试了此代码。您可以here对其进行检查。