[英]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;
}
});
其中rows
是Row[]
。
如果只有Java支持的lambdas ...這在很多語言中都是微不足道的。
但是,嗯,讓我們看看。 以下是兩種通用方法(這些主題有許多不同的變體):
Comparable
(例如“compareTo”) List<NewType>
) Arrays.sort
或Collections.sort
(或類似) 要么,
List<List<Object>>
) Comparator
器的表單來使用Arrays.sort
或Collections.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.