簡體   English   中英

如何在Java中使用Collections對從類填充的列表進行排序

[英]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,並且排序操作仍然正確。

規則是:

  • sgn(比較(x,y))= -sgn(比較(y,x))
  • 如果compare(x,y)> 0並比較(y,z)-> compare(x,z)> 0
  • 如果comapre(x,z)= 0-> sgn(compare(x,y))= -sgn(compare(y,x))

暫無
暫無

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

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