Java排序基于两列

时间:2011-07-29 19:26:47

标签: java sorting multiple-columns

假设我有这样的表:

 String | Int1 | Int2
 "foo"    5      0
 "faa"    4      1
 "zaa"    0      1
 "zoo"    4      2
 "laa"    4      3
 "loo"    1      4

我想得到的是这样的表:

 String | Int1 | Int2
 "foo"    5      0
 "laa"    4      3
 "zoo"    4      2
 "faa"    4      1
 "loo"    1      4
 "zaa"    0      1

首先发生的是基于列Int1的排序。

发生的第二件事情是基于列Int2,但仅限于列Int1中具有相同数字的行

如何在不使用任何数据库引擎的情况下解决此问题?

7 个答案:

答案 0 :(得分:10)

您通常使用List<Item>执行此操作,其中Item是包含所有三个值的类型(例如,第一行为“foo”,5,0)。

然后你会写一个Comparator<Item>来比较Item中呈现给它的两个compare对象的Int1值,如果这给出了明确的答案,则返回该答案。 ..并以其他方式比较Int2值。

答案 1 :(得分:4)

我假设你有一个具有2个整数的字符串的对象?

最简单的方法是使对象实现Comparable并实现compareTo()方法。或者您可以将比较器传递给Collections.sort(yourListOfObjects, yourCustomComparator)

compareTo()方法将首先比较第一个int,如果它们相等则比较第二个int。

@Override
public int compareTo(MyObject o) {
    // compare int1s .. if equal, compare int2s and return 0,1 or -1
}

这是一个有用的链接

http://download.oracle.com/javase/tutorial/collections/interfaces/order.html

答案 2 :(得分:4)

目前还不清楚你的意思是什么。但在一般情况下,您可以使用Comparator或使数据结构实现Comparable对Java中的数据进行排序。在您的情况下,您将创建一个简单的数据结构,在表中封装一行,然后为行数据结构创建Comparator或让它实现Comparable

例如

public class Row implements Comparable<Row> {
    public final String theString;
    public final int int1;
    public final int int2;

    public Row(String theString, int int1, int int2) {
        this.theString = theString;
        this.int1 = int1;
        this.int2 = int2;
   }

   public int compareTo(Row other) {
       if(this.int1 == other.int1) {
           return new Integer(this.int2).compareTo(other.int2);
       }

       return new Integer(this.int1).compareTo(other.int1);
   }
}

然后,您将创建List<Row>并使用java.util.Collections.sort(List<?>)对数据进行排序。

答案 3 :(得分:3)

首先要定义“表格”的含义。

我会在对象Row中包装每一行并保留这些Row的数组。然后,您可以实现Comparable<Row>界面或编写自己的Comparator<Row>

所以:

...
class Row implements Comparable<Row> {
    String s;
    int int1, int2;

    ...

    public int compareTo( Row r ) {
        if( int1 != r.int1 ) return int1-r.int1;
        else return int2-r.int2;
    }
}

并致电Arrays.sort(rows);

或者你可以这样做:

Arrays.sort(rows, new Comparator<Row>() {
    public int compare( Row r1, Row r2 ) {
        if( r1.int1 != r2.int1 ) return r1.int1-r2.int1;
        else return r1.int2-r2.int2;
    }
});

其中rowsRow[]

答案 4 :(得分:2)

如果只有Java支持的lambdas ......这在很多语言中都是微不足道的。

但是,嗯,让我们看看。以下是两种通用方法(这些主题有许多不同的变体):

  1. 使用有问题的成员创建新类型
  2. 制作类型工具Comparable(例如“compareTo”)
  3. 将此新类型的元素放入数组或列表(可能是List<NewType>
  4. 使用Arrays.sortCollections.sort(或类似)
  5. 或者,

    1. 创建嵌套数组或列表(可能是List<List<Object>>
    2. 使用Arrays.sort
    3. 中的表单使用Collections.sortComparator(或类似)

      快乐的编码。

答案 5 :(得分:1)

这样的东西?

public class Item implements Comparable<Item> {
    private String s;
    private Integer int1;
    private Integer int2;

    @Override
    public int compareTo(Item o) {
        int compare = int1.compareTo(o.int1);
        return compare != 0 ? compare : int2.compareTo(o.int2);
    }
}

答案 6 :(得分:-1)

我会在Comparator实现中使用CompareToBuilder。

使用示例,

    new Comparator<YourObjectType>() {
            @Override
            public int compare(YourObjectType o1, YourObjectType o2) {
                return new CompareToBuilder()
                   .append(o1.firstFieldToCompare, o2.firstFieldToCompare)
                   .append(o1.secondFieldToCompare, o2.secondFieldToCompare)
                   .toComparison();
            }
        }