Как отсортировать вектор векторов?

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

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

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

    main.add(row);

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

спасибо

5 ответов


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

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


Я думаю, вы хотите сортировать в "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
}});

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

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

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"

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


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


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