Как отсортировать вектор векторов?
в 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 Компаратор Колонки делает это для вас.