【问题标题】:Ordering a list using another list. swap items based on second list使用另一个列表对列表进行排序。根据第二个列表交换项目
【发布时间】:2019-06-17 06:49:24
【问题描述】:

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

}

【问题讨论】:

  • 对于实际场景,列表B仍然只是列表A中对象的子集,就像您的第一个示例一样?
  • @JoakimDanielson ,是 id 的子集,因为列表 B 不包含对象。
  • 您的列表 B 是否将始终是列表 A 的子集。或者列表 A 只能包含列表 B 的子集?

标签: java sorting comparator


【解决方案1】:

这不是比较器的情况。我的想法是构建一个映射,将列表 B 的值作为键保存,将列表 A 中的索引保存为值。然后通过该地图,您可以在列表 A 中进行适当的切换

【讨论】:

  • 谢谢,在这种情况下,如果我们用键 n 个索引构建一个映射,那么我们如何识别将 A 与 D 交换?
  • 你遍历你的地图,看看元素是否需要根据你的 List B 进行切换。
  • 例如:列表 A= [X, A, Y, B, C, D, E, F] ,列表 B = [D, B, X] 结果: [D, A, Y, B、C、X、E、F]这样的样本?
  • 您的最后一条评论是对您问题的简短重复。没有额外的问题。我很确定您在评论中提出的问题与您原来的问题不同。
【解决方案2】:

试试下面的功能。

在这里,我假设列表 B 将是列表 A 的完整子集。如果不是这样,您需要过滤列表 B,以便删除列表 A 中不存在的所有 MongoIds .

说明:迭代 List A 并检查当前元素是否是 List B 的一部分。如果是,则获取列表B 的第一个元素,并在列表A 中找到它的索引。假设您在索引b0 找到它。之后,您可以将迭代中的 List A 的当前元素替换为 a[b0] 处的元素。之后,您可以对 List A 的所有其他元素重复此练习,您可以在 List B 中找到其 mongoId

注意:每次在 List B 中找到 mongoId 时,都必须增加 swap 的计数以获取 List 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

【讨论】:

  • 我应该在这解释什么?所有这些行都是不言自明的。
  • @JoakimDanielson 完成。如果您觉得需要一些额外的解释,请告诉我。
猜你喜欢
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
相关资源
最近更新 更多