簡體   English   中英

Java排序基於兩列

[英]Java sort based on two 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列的Int1

發生的第二件事是基於Int2列,但僅限於Int1列中具有相同數字的行

如何在不使用任何數據庫引擎的情況下解決此問題?

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

然后你編寫一個Comparator<Item> ,比較在compare呈現給它的兩個Item對象的Int1值,如果給出了明確的答案,則返回該答案......否則比較Int2值。

我假設你有一個具有2個整數的字符串的對象?

最簡單的方法是使對象實現Comparable並實現compareTo()方法。 或者您可以將Comparator傳遞給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

目前還不清楚你的表是什么意思。 但在一般情況下,您可以使用Comparator對數據進行排序,或者使您的數據結構實現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<?>)對數據進行排序。

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

我會在對象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[]

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

但是,嗯,讓我們看看。 以下是兩種通用方法(這些主題有許多不同的變體):

  1. 使用相關成員創建新類型
  2. 使類型實現Comparable (例如“compareTo”)
  3. 將此新類型的元素放入數組或列表(可能是List<NewType>
  4. 使用Arrays.sortCollections.sort (或類似)

要么,

  1. 創建嵌套數組或List(可能是List<List<Object>>
  2. 使用帶有Comparator器的表單來使用Arrays.sortCollections.sort (或類似的)

快樂的編碼。

像這樣的東西?

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);
    }
}

我會在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();
            }
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM