2016-09-23 58 views
2

我需要使用多個屬性進行排序名單,我想這個代碼,但我得到一個編譯錯誤排序列表()編譯錯誤

package com.demo; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 

import lombok.Data; 
import lombok.extern.log4j.Log4j; 

@Log4j 
public class TestSort { 

    public static void main(String[] args) { 

     List<Kot> kots = new ArrayList<Kot>(){{ 

      add(new Kot("aa",1)); 
      add(new Kot("vv",1)); 
      add(new Kot("zz",2)); 
      add(new Kot("bb",3)); 
      add(new Kot("cc",1)); 
     }}; 

     log.info(kots); 
     Collections.sort(kots); 
     log.info(kots); 
    } 
} 

@Data 
class Kot implements Comparator<Kot> { 

    private String productName; 
    private Integer kotNo; 

    public Kot(){} 

    public Kot(String productName,Integer kotNo){ 
     this.productName = productName; 
     this.kotNo = kotNo; 
    } 

    @Override 
    public int compare(Kot kot1, Kot kot2) { 
     int kotNoCompare = kot1.kotNo.compareTo(kot2.kotNo); 
     if (kotNoCompare == 0) { 
      int productNameCompare = kot1.productName.compareTo(kot2.productName); 
      return productNameCompare; 
     } 
     return kotNoCompare; 
    } 
} 

錯誤顯示在下面的行

Collections.sort(kots);

錯誤說,

界不匹配:類型類別的一般方法排序(列表)是不是一個適用於參數(List)。推斷類型Kot不是有界參數的有效替代>

我在做什麼錯了?

回答

4

你需要實現Comparable這個接口。 E.g:

class Kot implements Comparable<Kot> { 

    private String productName; 
    private Integer kotNo; 

    public Kot() { 
    } 

    public Kot(String productName, Integer kotNo) { 
     this.productName = productName; 
     this.kotNo = kotNo; 
    } 

    @Override 
    public int compareTo(Kot kot1) { 
     int kotNoCompare = kot1.kotNo.compareTo(this.kotNo); 
     if (kotNoCompare == 0) { 
      int productNameCompare = kot1.productName.compareTo(this.productName); 
      return productNameCompare; 
     } 
     return kotNoCompare; 
    } 
} 

如果你想使用Comparator而已,那麼你必須到比較邏輯移到一個單獨的類。 Kot仍然是一個簡單的POJO類,只包含getter和setter。

例如Comparataor只有邏輯:

class Comp implements Comparator<Kot>{ 
    @Override 
     public int compare(Kot kot1, Kot kot2) { 
      int kotNoCompare = kot1.getKotNo().compareTo(kot2.getKotNo()); 
      if (kotNoCompare == 0) { 
       int productNameCompare = kot1.getProductName().compareTo(kot2.getProductName()); 
       return productNameCompare; 
      } 
      return kotNoCompare; 
     } 
} 

現在排序列表,您可以使用排序的另一種方法:

Collections.sort(kots, new Comp()); 
+0

謝謝@Sachin這是一個明確的答案 –

2

你讓你的Kot a ComparatorKot s。然而,sort()方法希望KotComparable到其他Kot S:

class Kot implements Comparable<Kot> { 
    ... 
    public int compareTo(Kot otherKot) { 
     // Comparison logic needs to be transformed 
     // to compare otherKot to this, rather than kot1 to kot2 
     ... 
    } 
} 

你也可以分割你的類成KotKotComparator,移動比較邏輯爲KotComparator,並使用sort()超載,需要一個定製的比較做整理。

0

我假設你需要理清

  • 先用kotNo
  • 然後wi th productName

其實這個Comparable事情是一個古老的。使用Java 8所有你需要的只有一條線,

List<Kot> kots = new ArrayList<Kot>(){{ 
     add(new Kot("aa",1)); 
     add(new Kot("vv",1)); 
     add(new Kot("zz",2)); 
     add(new Kot("bb",3)); 
     add(new Kot("cc",1)); 
}}; 

kots = kots.stream().sorted(
       comparing(Kot::getKotNo) 
       .thenComparing(comparing(Kot::getProductName))) 
       .collect(toList());