2011-03-09 117 views
60

我想開發汽車列表的排序演示。我正在使用數據表來顯示汽車列表。現在實際上我想按汽車顏色對列表進行排序。這裏不按字母順序排序。我想使用我的自定義排序順序,如紅色汽車先來,然後藍色等。使用比較器進行自定義排序

爲此,我嘗試使用Java比較和可比較,但它只允許按字母順序排序。

那麼,任何人都可以指導我實現使用該技術的方式,以便排序變得更快。

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

public class CarSort implements Comparable<CarSort>{ 

    String name; 
    String color; 

    public CarSort(String name, String color){ 
     this.name = name; 
     this.color = color; 
    } 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getColor() { 
     return color; 
    } 
    public void setColor(String color) { 
     this.color = color; 
    } 

    //Implement the natural order for this class 
    public int compareTo(CarSort c) 
    { 
     return getName().compareTo(c.getName()); 
    } 

    static class ColorComparator implements Comparator<CarSort> 
    {    
     public int compare(CarSort c1, CarSort c2) 
     { 
      String a1 = c1.getColor(); 
      String a2 = c2.getColor(); 
      return a1.compareTo(a2); 
     } 
    } 

    public static void main(String[] args) 
    { 
     List<CarSort> carList = new ArrayList<CarSort>(); 
     List<String> sortOrder = new ArrayList<String>(); 

     carList.add(new CarSort("Ford Figo","Silver")); 
     carList.add(new CarSort("Santro","Blue")); 
     carList.add(new CarSort("Honda Jazz","Magenta")); 
     carList.add(new CarSort("Indigo V2","Red")); 

     sortOrder.add("Red"); 
     sortOrder.add("Magenta"); 
     sortOrder.add("Blue"); 
     sortOrder.add("Silver");    

     // Now here I am confuse how to implement my custom sort    
    } 
} 

回答

86

我建議你創建你的車的顏色,而不是使用字符串和枚舉的自然順序將在其聲明中的常量的順序枚舉。

public enum PaintColors { 
    SILVER, BLUE, MAGENTA, RED 
} 

static class ColorComparator implements Comparator<CarSort> 
{ 
    public int compare(CarSort c1, CarSort c2) 
    { 
     return c1.getColor().compareTo(c2.getColor()); 
    } 
} 

你改變了字符串PaintColor,然後在主你的車列表變成:

carList.add(new CarSort("Ford Figo",PaintColor.SILVER)); 

... 

Collections.sort(carList, new ColorComparator()); 
+0

如何將我運行此example.PaintColors在ColorComparator.could不訪問您說明了如何的主要方法會是什麼樣子。 – Deepak 2011-03-09 11:42:43

+0

輸出是什麼?它總是首先是銀色的? – Deepak 2011-03-09 11:49:51

+0

@Deepak:是的,enum值的自然順序是其值的定義順序。 – 2011-03-09 12:17:42

4

我認爲這可以如下進行:

class ColorComparator implements Comparator<CarSort> 
{ 
    private List<String> sortOrder; 
    public ColorComparator (List<String> sortOrder){ 
     this.sortOrder = sortOrder; 
    } 

    public int compare(CarSort c1, CarSort c2) 
    { 
      String a1 = c1.getColor(); 
      String a2 = c2.getColor(); 

      return sortOrder.indexOf(a1) - sortOrder.indexOf(a2); 
    } 
} 

對於分揀使用t他:

Collections.sort(carList, new ColorComparator(sortOrder)); 

P. S.我在不調試它的瀏覽器中編寫了這段代碼。但是這個概念應該清楚。

+0

嗨ilya,謝謝你...這是非常簡單和偉大的方式。 – akhtar 2011-03-09 13:11:10

35

如何:

List<String> definedOrder = // define your custom order 
    Arrays.asList("Red", "Green", "Magenta", "Silver"); 

Comparator<Car> comparator = new Comparator<Car>(){ 

    @Override 
    public int compare(final Car o1, final Car o2){ 
     // let your comparator look up your car's color in the custom order 
     return Integer.valueOf(
      definedOrder.indexOf(o1.getColor())) 
      .compareTo(
       Integer.valueOf(
        definedOrder.indexOf(o2.getColor()))); 
    } 
}; 

原則上,我同意使用enum是一個更好的辦法,但這個版本更加靈活,因爲它可以讓你定義不同的排序順序。

更新

Guava具有此功能內置到其Ordering類:

List<String> colorOrder = ImmutableList.of("red","green","blue","yellow"); 
final Ordering<String> colorOrdering = Ordering.explicit(colorOrder); 
Comparator<Car> comp = new Comparator<Car>() { 
    @Override 
    public int compare(Car o1, Car o2) { 
     return colorOrdering.compare(o1.getColor(),o2.getColor()); 
    } 
}; 

這個版本是有點更簡潔。


再次更新

的Java 8使比較甚至更少詳細:符合

Comparator<Car> carComparator = Comparator.comparing(
     c -> definedOrder.indexOf(c.getColor())); 
20

比較...

List<Object> objList = findObj(name); 
Collections.sort(objList, new Comparator<Object>() { 
    @Override 
    public int compare(Object a1, Object a2) { 
     return a1.getType().compareToIgnoreCase(a2.getType()); 
    } 
}); 
4

我必須做同樣的事情Sean和ilalex的回答。
但我有太多的選項來明確定義排序順序,並且只需要將某些條目浮動到列表的前面......以指定的(非自然的)順序。
希望這對別人有幫助。

public class CarComparator implements Comparator<Car> { 

    //sort these items in this order to the front of the list 
    private static List<String> ORDER = Arrays.asList("dd", "aa", "cc", "bb"); 

    public int compare(final Car o1, final Car o2) { 
     int result = 0; 
     int o1Index = ORDER.indexOf(o1.getName()); 
     int o2Index = ORDER.indexOf(o2.getName()); 
     //if neither are found in the order list, then do natural sort 
     //if only one is found in the order list, float it above the other 
     //if both are found in the order list, then do the index compare 
     if (o1Index < 0 && o2Index < 0) result = o1.getName().compareTo(o2.getName()); 
     else if (o1Index < 0) result = 1; 
     else if (o2Index < 0) result = -1; 
     else result = o1Index - o2Index; 
     return result; 
    } 

//Testing output: dd,aa,aa,cc,bb,bb,bb,a,aaa,ac,ac,ba,bd,ca,cb,cb,cd,da,db,dc,zz 
} 
1

在Java 8,你可以做這樣的事情:

首先,您需要一個枚舉:

public enum Color { 
    BLUE, YELLOW, RED 
} 

車類:

public class Car { 

    Color color; 

    .... 

    public Color getColor() { 
     return color; 
    } 

    public void setColor(Color color) { 
     this.color = color; 
    } 
} 

,然後使用你的車列表,你可以簡單地做:

Collections.sort(carList, Comparator:comparing(CarSort::getColor)); 
+0

這不是一個自定義排序。 – zygimantus 2017-04-12 11:19:57

+0

此外,它不是一個「功能」的做法...這有副作用! – Programmer 2017-11-16 04:39:58

1

定義一個枚舉類型作爲colorString

public enum Colors { 
    BLUE, SILVER, MAGENTA, RED 
} 

變更數據類型到吸氣劑和顏色的設置器方法的Colors 變化返回類型和參數類型到Colors

定義比較器類型如下

static class ColorComparator implements Comparator<CarSort> 
{ 
    public int compare(CarSort c1, CarSort c2) 
    { 
     return c1.getColor().compareTo(c2.getColor()); 
    } 
} 

將元素添加到List之後,調用通過傳遞列表和比較對象作爲參數的收集排序方法

Collections.sort(carList, new ColorComparator()); 然後使用ListIterator打印。

滿級實現如下:

package test; 

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

public class CarSort implements Comparable<CarSort>{ 

    String name; 
    Colors color; 

    public CarSort(String name, Colors color){ 
     this.name = name; 
     this.color = color; 
    } 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public Colors getColor() { 
     return color; 
    } 
    public void setColor(Colors color) { 
     this.color = color; 
    } 

    //Implement the natural order for this class 
    public int compareTo(CarSort c) 
    { 
     return getName().compareTo(c.getName()); 
    } 

    static class ColorComparator implements Comparator<CarSort> 
    { 
     public int compare(CarSort c1, CarSort c2) 
     { 
      return c1.getColor().compareTo(c2.getColor()); 
     } 
    } 

    public enum Colors { 
     BLUE, SILVER, MAGENTA, RED 
    } 

    public static void main(String[] args) 
    { 
     List<CarSort> carList = new ArrayList<CarSort>(); 
     List<String> sortOrder = new ArrayList<String>(); 

     carList.add(new CarSort("Ford Figo",Colors.SILVER)); 
     carList.add(new CarSort("Santro",Colors.BLUE)); 
     carList.add(new CarSort("Honda Jazz",Colors.MAGENTA)); 
     carList.add(new CarSort("Indigo V2",Colors.RED)); 
     Collections.sort(carList, new ColorComparator()); 

     ListIterator<CarSort> itr=carList.listIterator(); 
     while (itr.hasNext()) { 
      CarSort carSort = (CarSort) itr.next(); 
      System.out.println("Car colors: "+carSort.getColor()); 
     } 
    } 
} 
相關問題