如何对一个向量的向量进行排序?

6
在Java中,我想知道如何根据特定列对向量的向量进行排序,其中一个向量用作行,另一个向量用于保存所有行向量,例如:
 Vector row = new Vector();
    Vector main = new Vector();

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

    main.add(row);

然后在其中一个列(例如Column2)中对变量进行排序。

谢谢


9
请搜索一下,这个问题被问得非常频繁。此外:你正在遭受“对象否定”的困扰(参考链接)。将内部 Vector 改为自定义类的对象会让你的生活变得更加轻松! - Joachim Sauer
4
现在在Java中,你应该真的使用List<T>ArrayList<T> - jjnguy
5个回答

8
你可以编写一个Comparator<Vector>,它基于第二个元素来比较两个Vector对象,并使用Collections.sort(List,Comparator)进行排序。
但是从长远来看,如果你摆脱了Vector-in-Vector的结构,并用表示所需数据的自定义类替换内部的Vector,那么你将获得更好的效果。然后,你可以编写一个Comparator<MyClass>,这将更容易解释("哦,这个比较器基于名字的第一个字母比较",而不是"为什么这个比较器要取索引为1的元素并比较?这是什么意思?")。

4
我猜您希望在“主要内容”中排序,而不是在“行”中排序:
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

为什么人们仍然使用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 进行排序。 我们只需要实现一个比较器类,该类能够根据我们的参数 - 在本例中是某个特定列 - 比较两行:

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"

注意 - 这只是一个不完整的实现,我没有检查索引值是否有效以及所有行是否具有相同的大小..这应该在生产代码中完成。


人们使用Vector是因为他们不知道Collections类的存在,或者他们不理解Collections类。我长时间使用Properties类。 - Gilbert Le Blanc
你可以这样定义 MyComparatorclass MyComparator<T extends Comparable<? super T>> implements Comparator<List<T>>。这样你也可以在 List<Number> 或其他 Comparable 对象的列表上使用它。 - Joachim Sauer

0

向量可能不是您表格的最佳表示方式。请查看Glazed Lists


0
创建一个可重复使用的比较器,可以用于对向量(或列表或数组)中的任何索引进行排序。列比较器可以为您完成此操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接