我有一个包含Fruits的ArrayList。
我还有一个名为“苹果”的子类子。
苹果有一个“颜色”属性,其他Fruits子类没有。
如何排序此列表? (我必须将“Apple”对象放在另一个列表中。)
Fruits是父类,Apple和其他类是子类。
答案 0 :(得分:3)
使用instanceof
将是一种方法。
Fruits[] myFruits = ...... // Array of fruits
for (int i = 0; i < myFruits.length; i++) {
if (myFruits[i] instanceof Apple) {
// ...
} else {
// ...
}
}
答案 1 :(得分:2)
java.util.Collections.sort(listOfFruits,(fruit1,fruit2) -> /*implementation of your order relation between Fruits*/ 0);
答案 2 :(得分:1)
有两种解决方案:
实施
Comparator<Fruit>
但这只需要比较Fruits,所以你的Fruit类必须拥有比较属性所需的全部内容。或者你可以在其中使用instanceOf,这应该让你安全地投射。
new Comparator<Fruit>{
@Overwrite
public int compare(Fruit a1, Fruita 2) {
if(a1 instanceOf Apple.class) {...}
else if ( ... ){}
...
}
}
Fruits
实施Comparable
界面。这样每个人都有自己的逻辑,但这种方法不太可取 - 紧密耦合。我的解决方案:
如果您只想获得苹果,可以使用Comparator<Apple>
将数组拆分为两个(苹果和非苹果)并仅对苹果进行排序。
List<Apples> apples = fruits.filter(m -> m.getClass()== Apple.class).collect(Collectors.toList());
Collections.sort(apples, new Comparator<Apple>{
@Overwrite
public int compare(Apple a1, Apple a2) {
}
})
答案 3 :(得分:1)
您应该使用Fruit
或通过为每个子类实现特定实现来实现instanceof
中的comparable class。
即:
public class Fruit implements Comparable<Fruit> {
String fruitName;
public int compareTo(Fruit other){
// compareTo should return < 0 if this is supposed to be
// less than other, > 0 if this is supposed to be greater than
// other and 0 if they are supposed to be equal
if (fruitName == null) {
if (other.fruitName == null) {
return 0;
} else {
return -1;
}
} else {
if (other.fruitName == null) {
return 1;
}
}
return fruitName.compareTo(other.fruitName);
}
}
另一种选择是定义comparator,例如:
public class MyFruitcomparator implements Comparator<Fruit> {
public int compare(Fruit obj1, Fruit obj2) {
//your logic here, below just an example
return obj1.getFruitName().compareTo(obj2.getFruitName());
}
}
在上面的示例中,我使用fruitName
作为示例,但实际的实现取决于您的需求。