2015-10-16 85 views
0

我有一個列表如何排序列表<? extends T>

List<? extends T> generics; 

我們如何排序呢?是否可以比較Comparator實現上的子類對象?

感謝

+0

Collections.sort(泛型)? – ergonaut

+0

您想如何比較列表中的對象? – Misha

+0

我想知道如果該列表中包含蘋果,橙子或Fruit類型的梨,比較器代碼中可能的比較方式是什麼。 – JavaXen

回答

2

Collections.sort,其中T必須implements Comparable<T>

不過,我會結合T到具有finalcompareTo一個已知的基類,以確保比較蘋果和梨,當你把他們兩個水果

編輯: 從您的評論你可以去上面的建議,但替代執行門庭Comparable是寫一個Comparator和使用Collections.sort(List, Comparator)

無論哪種方式,如果你有蘋果,梨或橙子,那麼我會建議做一個抽象類水果,並在水果方面實現可比/比較器 - 這是唯一明智的方法來比較蘋果和梨等 - 通過所有子類共有的屬性。

示例代碼:

public abstract class Fruit implements Comparable<Fruit> { 

    public abstract String getName(); 

    public abstract Integer getWeightInGrams(); 

    @Override 
    public final int compareTo(Fruit other) 
    { 
     return getName().compareTo(other.getName()); 
    } 
} 

public class Orange extends Fruit { 

    private final Integer weightInGrams; 

    public Orange(int weightInGrams) 
    { 
     this.weightInGrams = weightInGrams; 
    } 

    @Override 
    public String getName() 
    { 
     return "Orange"; 
    } 

    @Override 
    public Integer getWeightInGrams() 
    { 
     return weightInGrams; 
    } 
} 


//Or just using comparators (in which case Fruit does not need to implement Comparable): 

public class FruitWeightComparator implements Comparator<Fruit> { 

    @Override 
    public int compare(Fruit o1, Fruit o2) 
    { 
     return o1.getWeightInGrams().compareTo(o2.getWeightInGrams()); 
    } 
} 


public class FruitNameComparator implements Comparator<Fruit> { 

    @Override 
    public int compare(Fruit o1, Fruit o2) 
    { 
     return o1.getName().compareTo(o2.getName()); 
    } 
} 
+0

這是在面試時問的。他們沒有提供T是否實現Comparable的細節。名單可能有蘋果或梨或橘子。我們怎麼能爲此編寫比較器代碼? – JavaXen

+0

非常感謝您的詳細解釋。所以如果我們實現比較器,我們只能檢查基類變量。如果(Apple的Apple實例&& o2實例){return compare o1.get()。compareTo(o2.get)} – JavaXen

+0

您在這裏是否有真正的用例?不知道我明白你會做什麼,當o1 instanceof Apple && o2 instance of Banana。無論你想避免類型反思(即根據收到的類型不同的行爲)。 – earcam

0

我們怎麼能進行排序呢?

所有元素必須相互可比,即<T extends Comparable<? super T>>。這意味着T類型的元素不僅可以與T進行比較,而且還可以與super to T類型的元素進行比較。

如果您沒有指定比較器,那麼在這種情況下,列表將按照自然排序按升序排序。在你的情況下,類將有多個字段,並使用自定義比較有意義。

是否可以比較比較器 執行的子類對象?

是的。如果指定了<T extends Comparable<T>>,那麼只有類型爲T的元素可以相互比較,但如果使用<T extends Comparable<? super T>>,則超類的元素也會包含在內。

+0

您可以分享示例代碼以更多地瞭解您的第二種解釋 – JavaXen