Java 将一个列表与另一个列表排序

Java 将一个列表与另一个列表排序,java,sorting,arraylist,Java,Sorting,Arraylist,是否可以使用带有比较器的Java Collections排序方法来对一个列表进行排序,同时根据原始列表的索引对另一个列表进行排序,从而使列表保持成对?谢谢。否,因为您要传递给排序的比较器一次只给出一对条目,并简单地返回这两个元素的顺序。比较器看不到完整的列表,因此无法同时对另一个列表进行有效排序 听起来你要找的是一张排序过的地图。“第二个列表”实际上只是第一个集合中“键”的值。随着键被重新排序,值将随之移动。使用比较器无法做到这一点。问题的解决方案是构建第三个列表,其中包含给定列表中的对应元素对

是否可以使用带有比较器的Java Collections排序方法来对一个列表进行排序,同时根据原始列表的索引对另一个列表进行排序,从而使列表保持成对?谢谢。

否,因为您要传递给
排序的比较器一次只给出一对条目,并简单地返回这两个元素的顺序。比较器看不到完整的列表,因此无法同时对另一个列表进行有效排序


听起来你要找的是一张排序过的地图。“第二个列表”实际上只是第一个集合中“键”的值。随着键被重新排序,值将随之移动。

使用比较器无法做到这一点。问题的解决方案是构建第三个列表,其中包含给定列表中的对应元素对。然后排序,并复制回原始列表

public class Pair<X,Y> {
  public final X x;
  public final Y y;

  public Pair(X x, Y y) {
    this.x = x; this.y = y;
  }
}

public static<X,Y> void sortTwoLists(List<X> xs, List<Y> ys, final Comparator<X> c) {
 if (xs.size() != ys.size()) 
   throw new RuntimeException("size mismatch");

 List<Pair<X,Y>> temp = new ArrayList<Pair<X,Y>>();

 for (int i = 0; i < xs.size(); ++i) 
   temp.add(new Pair<X,Y>(xs.get(i), ys.get(i)));

 Collections.sort(temp, new Comparator<Pair<X,Y>>() {
  @Override
  public int compare(Pair<X, Y> a, Pair<X, Y> b) {
    return c.compare(a.x, b.x);
  }
 });

 for(int i = 0; i < xs.size(); ++i) {
   xs.set(i, temp.get(i).x);
   ys.set(i, temp.get(i).y);
 }
}
公共类对{
公开决赛X X;
公共决赛;
公共对(X,Y,Y){
这个.x=x;这个.y=y;
}
}
公共静态无效排序列表(列表xs、列表ys、最终比较器c){
如果(xs.size()!=ys.size())
抛出新的运行时异常(“大小不匹配”);
List temp=new ArrayList();
对于(int i=0;i
为什么不使用同一个比较器分别对两个列表进行排序?@anubhava-如果两个列表包含不同的数据,但需要它们的顺序保持同步,则对它们进行排序将产生不同的顺序。@anubhava,因为这没有帮助。排序后,列表A的每个元素都会更改其位置。OP想要列表B,即所谓的平行列表,具有相同的排列。如果列表a中的元素i转到位置j,那么
B[i]
应该转到B[j]“是的,您完全可以编写自己的排序方法来实现这一点。我会让它包含主列表、一个比较器和一个保持“索引同步”的列表。从这里开始,您只需在第一个列表排序时跟踪元素移动到的位置,并以相同的方式移动第二个列表中的元素。@user1055696定义一个类
;创建一个方法
列表组合(列表,列表)
;使用
比较器对该列表进行排序
;创建一个方法
对拆分(列表)
-就完成了。并不是说这是一个首选的解决方案——我不知道你的真正目标,但它是可行的和可读的。是的,这大概就是我在回答中使用排序映射的意思+1对于实际的解决方案:)您能举一个如何使用这个的例子吗?