使用其他列表对列表进行排序

时间:2012-01-11 21:02:25

标签: java sorting arraylist

是否可以将Java Collections排序方法与比较器一起使用,因为它会对一个列表进行排序,以便按原始列表的索引对另一个列表进行排序,以便列表保持配对?感谢。

2 个答案:

答案 0 :(得分:4)

不,因为您传入sort的比较器一次只能获得一对条目,只是简单地给出这两个元素的顺序。比较器没有看到完整列表,因此不能用于同时有效地对另一个列表进行排序。

你正在寻找的是一个有序的地图。那么“第二个列表”实际上只是第一个集合中“键”的值。当键被重新排序时,值将随之移动。

答案 1 :(得分:4)

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

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);
 }
}