[英]How to use Collections in java to sort list populated from a class
我在嘗試對以下列表進行排序時遇到麻煩。 只需使用Collections.sort(mylist); 顯示錯誤,我是Java初學者,無法理解
Myclass x1 = new Myclass("8", "12");
Myclass x2 = new Myclass("6", "9");
Myclass x3 = new Myclass("11", "14");
List<Myclass> mylist = Arrays.asList(x1, x2, x3);
如何對“ mylist”進行排序,使其以以下順序存儲-(6,9),(8,12),(11,14),即根據元組的第一個值
Collections.sort(myList, myComparator);
myComparator
應該是您對Comparator
接口的自定義實現。
假設Myclass
具有getFirstValue
方法,則您的Comparator
可以是:
public class MyComaparator implements Comparator<Myclass> {
@Override
public int compare(Myclass arg0, Myclass arg1) {
return arg0.getFirstValue() - arg1.getFirstValue();
}
}
請注意,我還假設getFirstValue()
不返回null
。 驗證部分由您決定。 我建議您在Tuple
實現中使用基Tuple
來輕松解決此問題。
官方文檔在這里 。
您是否真的要將數字作為字符串傳遞,然后在可能的情況下將它們作為數字進行比較?
我認為Myclass
具有以下接口:
class Myclass {
public Myclass(String first, String second) {..}
public String getFirst() {..}
public String getSecond() {..}
}
然后實施您的自定義Comparator
,如下所示。 由於您正在比較字符串但考慮數字,因此請使用AlphanumComparator (將Java實現放入某些程序包中):
public class MyComparator implements Comparator<Myclass> {
private final static AlphanumComparator alphaNum = new AlphanumComparator();
@Override
public int compare(Myclass a, Myclass b) {
return alphaNum.compare( a.getFirst(), b.getFirst() );
}
}
您可以致電:
Collections.sort(myList, new MyComparator())
或者,您可以讓您的類實現Comparable
接口 ,然后Collections.sort(myList)將根據該接口的compareTo
方法對其進行排序。
但是,如果未正確詢問您的問題,而Myclass
實際上是一對整數(不是字符串),則可以按如下所示簡單地定義比較器:
public class MyComparator implements Comparator<Myclass> {
@Override
public int compare(Myclass a, Myclass b) {
return a.getFirst() - b.getFirst();
}
}
您可以通過使用相當或比較接口實現這一目標。 由於您是一個自定義對象,因此您必須告訴Collections.sort
方法應根據什么基礎比較集合中的兩個對象。 這是一個很好的例子。
您可以使用兩種方法對類Myclass實現排序功能。
方法#1- >使用Myclass實現Comparable
,並在compareTo方法中編寫自定義比較。 喜歡,
Myclass ==>
public class Myclass implements Comparable {
private String value1;
private String value2;
public Myclass(String value1, String value2) {
super();
this.value1 = value1;
this.value2 = value2;
}
public String getValue1() {
return value1;
}
public void setValue1(String value1) {
this.value1 = value1;
}
public String getValue2() {
return value2;
}
public void setValue2(String value2) {
this.value2 = value2;
}
@Override
public int compareTo(Object o) {
Myclass cl = (Myclass)o;
return Integer.valueOf(value1) - Integer.valueOf(cl.getValue1()) ;
}
}
測試代碼==>
public class Main {
public static void main(String[] args) {
Myclass x1 = new Myclass("8", "12");
Myclass x2 = new Myclass("6", "9");
Myclass x3 = new Myclass("11", "14");
List<Myclass> mylist = Arrays.asList(x1, x2, x3);
//Sort list
Collections.sort(mylist);
//Print List content
for( Myclass cla : mylist )
{
System.out.printf("(%s,%s)", cla.getValue1(),cla.getValue2());
}
}
}
在控制台中輸出==>
(6,9)(8,12)(11,14)
Use this method, you can use Collections.sort(myList); to sort the object in list
Use this method, you can use Collections.sort(myList); to sort the object in list
。
方法2- >
如果您不想使Myclass實現Comparable,請編寫一個客戶比較器。
使用此方法,可以使用Collections.sort(myList,customComparator);
對列表中的對象進行排序。
關於方法2, Adam
提供了上面的示例。 我不會在這里提供它。
因為您的對象沒有自然順序(如整數),所以您需要自己使用一個指定比較器機制。
Collections.sort(myList, new Comparator<Myclass>() {
public int compare(Myclass o1, Myclass o2) {
// I don't know how you access the first integer in your 'MyClass'
// replace by your own.
int number1 = o1.getFirstElement();
int number2 = o2.getFirstElement();
if (number1 < number2 ) {
return -1;
} else if (number1 > number2 ) {
return 1;
} else {
return 0;
}
}
});
您總是比較兩個對象,所以即使兩個對象之間的差更大,結果也只能是-1 1和0:比較(6,9)和(8,12)會導致比較器在差時返回1是2比較(8,12)和(11,14)將導致比較器在差為3時返回1,並且排序操作仍然正確。
規則是:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.