对包含子类的arraylist进行排序

时间:2015-06-25 13:42:43

标签: java sorting arraylist

我有一个包含Fruits的ArrayList。

我还有一个名为“苹果”的子类子。

苹果有一个“颜色”属性,其他Fruits子类没有。

如何排序此列表? (我必须将“Apple”对象放在另一个列表中。)

Fruits是父类,Apple和其他类是子类。

4 个答案:

答案 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)

有两种解决方案:

  1. 实施

    Comparator<Fruit>

  2. 但这只需要比较Fruits,所以你的Fruit类必须拥有比较属性所需的全部内容。或者你可以在其中使用instanceOf,这应该让你安全地投射。

    new Comparator<Fruit>{
          @Overwrite
          public int compare(Fruit a1, Fruita 2) {
             if(a1 instanceOf Apple.class) {...}
             else if ( ... ){}
             ...
          }
    
        }
    
    1. 拥有Fruits实施Comparable界面。这样每个人都有自己的逻辑,但这种方法不太可取 - 紧密耦合。
    2. 我的解决方案:

      如果您只想获得苹果,可以使用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作为示例,但实际的实现取决于您的需求。