10

假设我有这样的表:

 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

发生的第一件事是基于 column 排序Int1

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

我应该如何在不使用任何数据库引擎的情况下解决这个问题?

4

7 回答 7

10

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

然后,您将编写一个比较在 中呈现给它的两个对象Comparator<Item>的 Int1 值,如果给出了明确的答案,则返回该答案......否则比较 Int2 值。Itemcompare

于 2011-07-29T19:29:37.660 回答
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

于 2011-07-29T19:30:00.607 回答
4

不太清楚你所说的表格是什么意思。但在一般情况下,您通过使用Comparator或使您的数据结构实现在 Java 中对数据进行排序Comparable。在您的情况下,您将创建一个简单的数据结构来封装表中的一行,然后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<?>)来对您的数据进行排序。

于 2011-07-29T19:39:45.700 回答
2

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

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

  1. 使用相关成员创建新类型
  2. 使类型实现Comparable(例如“compareTo”)
  3. 将这种新类型的元素放入 Array 或 List 中(也许List<NewType>
  4. 使用Arrays.sortCollections.sort(或类似)

或者,

  1. 创建一个嵌套数组或列表(也许List<List<Object>>
  2. 使用Arrays.sortCollections.sort(或类似的)使用形式Comparator

快乐编码。

于 2011-07-29T19:31:29.320 回答
2

好吧,首先定义“表格”的含义。

我会将每一行包装在一个对象中并保留这些sRow的数组。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[]

于 2011-07-29T19:33:44.433 回答
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);
    }
}
于 2011-07-29T19:36:43.660 回答
-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();
            }
        }
于 2016-07-04T20:56:29.963 回答