Сортировка списка с другим списком - PullRequest
6 голосов
/ 12 января 2012

Можно ли использовать метод сортировки коллекций Java с компаратором, поскольку он сортирует один список, чтобы также сортировать другой список по индексу исходного списка, чтобы списки оставались спаренными?Спасибо.

Ответы [ 2 ]

4 голосов
/ 12 января 2012

Вы не можете сделать это с Comparator. Решением вашей проблемы является создание третьего списка, который содержит пары соответствующих элементов из указанных списков. Затем сортируйте и копируйте обратно в исходные списки.

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);
 }
}
4 голосов
/ 12 января 2012

Нет, потому что компаратор, который вы передадите в sort, получает только пару записей за раз и просто возвращает порядок по этим двум элементам.Компаратор не видит полный список и поэтому не может быть использован для эффективной сортировки другого списка одновременно.

Похоже, что вы ищете, это отсортированная карта.«Второй список» - это на самом деле просто значения «ключа» в первом наборе.По мере изменения порядка ключей значения будут перемещаться вместе с ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...