回答
見Collections.sort,其中T
必須implements Comparable<T>
不過,我會結合T
到具有final
compareTo
一個已知的基類,以確保比較蘋果和梨,當你把他們兩個水果
編輯: 從您的評論你可以去上面的建議,但替代執行門庭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());
}
}
這是在面試時問的。他們沒有提供T是否實現Comparable的細節。名單可能有蘋果或梨或橘子。我們怎麼能爲此編寫比較器代碼? – JavaXen
非常感謝您的詳細解釋。所以如果我們實現比較器,我們只能檢查基類變量。如果(Apple的Apple實例&& o2實例){return compare o1.get()。compareTo(o2.get)} – JavaXen
您在這裏是否有真正的用例?不知道我明白你會做什麼,當o1 instanceof Apple && o2 instance of Banana。無論你想避免類型反思(即根據收到的類型不同的行爲)。 – earcam
我們怎麼能進行排序呢?
所有元素必須相互可比,即<T extends Comparable<? super T>>
。這意味着T
類型的元素不僅可以與T進行比較,而且還可以與super to T
類型的元素進行比較。
如果您沒有指定比較器,那麼在這種情況下,列表將按照自然排序按升序排序。在你的情況下,類將有多個字段,並使用自定義比較有意義。
是否可以比較比較器 執行的子類對象?
是的。如果指定了<T extends Comparable<T>>
,那麼只有類型爲T
的元素可以相互比較,但如果使用<T extends Comparable<? super T>>
,則超類的元素也會包含在內。
您可以分享示例代碼以更多地瞭解您的第二種解釋 – JavaXen
- 1. 排序列表<MyObject>
- 2. 排序列表<String[]>
- 3. 排序列表<>排序依據列表<string>計數
- 4. 列表<T>與列表之間的區別<? extends T>
- 5. 排序列表<DateTime>降序
- 6. 如何創建ArrayPredicate <A extends Object[]>?
- 7. 如何排序列表
- 8. 排序或順序排序列表<T> [] c#使用Linq
- 9. 按自然排序順序排序列表<FileInfo>。
- 10. 排序數組列表<object>
- 11. 排序定義列表(<dl>)
- 12. DataGridView和列表<T>和排序
- 13. 排序地圖列表<String,String>
- 14. 使用Ajax排序列表<Elements>
- 15. 如何排序列表<dynamic>包含ExpandoObjects
- 16. Java泛型通配符問題:列表<? extends A>
- 17. <extends Comparable>和<extends Comparable < T >>之間的區別?
- 18. 類型列表<Object[]>中的方法addAll(Collection <?extends Object []>)不適用於參數(列表<String>)
- 19. 如何排序無序鏈接列表
- 20. 如何排序地圖<YearMonth,列表<LocalDate>>與Java 8 Lambda和流
- 21. C#重新排序列表<string>基於另一個列表<string>
- 22. 排序列表<keyValuePair <字符串,字符串>>
- 23. 排序列表<KeyValuePair <int, string>>大寫和小寫
- 24. 排序列表<地圖<字符串,對象>>
- 25. 排序列表
- 26. 排序列表
- 27. 排序列表
- 28. 排序列表
- 29. 排序列表
- 30. 排序列表
Collections.sort(泛型)? – ergonaut
您想如何比較列表中的對象? – Misha
我想知道如果該列表中包含蘋果,橙子或Fruit類型的梨,比較器代碼中可能的比較方式是什麼。 – JavaXen