使用另一个列表订购一个列表。根据第二个清单交换项目

时间:2019-06-17 06:49:24

标签: java sorting comparator

我有两个列表,其中列表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

}

2 个答案:

答案 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对其进行检查。