Как отсортировать вектор векторов? - PullRequest
6 голосов
/ 17 мая 2011

В Java мне интересно, как отсортировать векторы векторов в определенном столбце, где один вектор используется в качестве строки, а один вектор используется для хранения всех векторов строки, например,

 Vector row = new Vector();
    Vector main = new Vector();

    row.add("Column1");
    row.add("Column2");
    row.add("Column3");

    main.add(row);

Затем сортируйте переменные в одном из столбцов, например, Column2.

Спасибо

Ответы [ 5 ]

8 голосов
/ 17 мая 2011

Вы могли бы написать Comparator<Vector>, который сравнивает два Vector объекта на основе их второго элемента и использует Collections.sort(List,Comparator) с этим.

Но в долгосрочной перспективе вам будет намного лучше, если вы избавитесь от конструкции Vector -in- Vector и замените внутренний Vector пользовательским классом, которыйпредставляет данные, которые вы хотите представить.Тогда вы бы написали Comparator<MyClass>, который было бы намного легче интерпретировать («о, этот компаратор сравнивает на основе имени», а не «почему этот компаратор берет элемент по индексу 1 и сравнивает его? Что это значит?»? ").

4 голосов
/ 17 мая 2011

Полагаю, вы хотите отсортировать в 'main', а не в 'row':

Vector<String> row = new Vector<String>();
Vector<Vector<String>> main = new Vector<Vector<String>>();

Collections.sort(main, new Comparator<Vector<String>>(){
    @Override  public int compare(Vector<String> v1, Vector<String> v2) {
        return v1.get(1).compareTo(v2.get(1)); //If you order by 2nd element in row
}});
2 голосов
/ 17 мая 2011

(почему люди до сих пор используют Vector и избегают генериков? Я должен задать этот вопрос на SO ...;))

Позвольте мне сначала предложить современный рефакторинг:

List<List<String>> main = new ArrayList<List<String>>();
List<String> row = new ArrayList<String>();
row.add("Column1");
row.add("Column2");
row.add("Column3");
main.add(row);

Теперь мы можем посмотреть на Collections.sort(Comparator<T> comp), который будет выполнять сортировку main. Нам просто нужно реализовать класс Comparator, который может сравнивать две строки в соответствии с нашим параметром, который в нашем случае является определенным столбцом:

public class MyComparator implements Comparator<List<String>> {
  private int columnIndex = 0;
  public MyComparator(int columnIndex) {this.columnIndex = columnIndex;}

  @Override
  public int compare(List<String> thisRow, List<String> otherRow) {
    return thisRow.get(columnIndex).compareTo(otherRow.get(columnIndex));
  }
}

Используйте компаратор так:

Collections.sort(main, new MyComparator(1));  // will sort according to "column2"

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

0 голосов
/ 17 мая 2011

Создание многоразового компаратора, который можно использовать для сортировки по любому индексу в векторе (или в списке, или в массиве). Компаратор столбцов сделает это за вас.

0 голосов
/ 17 мая 2011

Векторы, возможно, не лучшее представление вашей таблицы.Посмотрите Застекленные списки .

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