【问题标题】:How to sort with 2 Objects from 2 Classes by 1 properties如何按 1 个属性对 2 个类中的 2 个对象进行排序
【发布时间】:2020-08-07 18:01:13
【问题描述】:

假设我有两个类:

第 1 课:

class Person{
    String name;
    int age;
    public Person(){}
    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }
    @Override
    String toString(){
        return "Name: "+name + "\tAge: "+age;
    }
}

2 级

class Animal{
    String name;
    int age;
    public Animal(){}
    public Animal(String name, int age){
        this.name = name;
        this.age = age;
    }
    @Override
    String toString(){
        return "Name: "+name + "\tAge: "+age;
    }
}

我创建了一个列表对象来存储 2 个类 Person 和 Animal

List newList = new ArrayList<>();
newList.add( new Person("person", 20);
newList.add( new Person("aPerson",20);
newList.add( new Animal("animal",20);
newList.add( new Animal("aAnimal",20);

现在我想按namenewList 进行排序,但我不知道该怎么做。 使用一个类我可以创建类SortByName 并比较两个对象之间的名称,但是使用两个类我不能

【问题讨论】:

  • 您需要创建一个抽象。示例:Entity 接口,其中包含一个由两个实体实现的 getName () 方法。因此,您可以在 compare 方法中使用该类型。
  • 基类说他们都依赖的 NamedObject 将是一种方式。

标签: java sorting arraylist collections


【解决方案1】:

您需要的是Interface。您的AnimalPerson 类都提供name 作为它们的属性之一,因此您可以在这方面使用InterfaceNameable 来实质上指定您的类肯定具有name 属性。

您将对 Nameable 接口进行编码以创建 Nameable 的列表,并且您可以在该列表上创建一个排序器。

List<Nameable> list = new ArrayList<>();
newList.add( new Person("person", 20);
newList.add( new Person("aPerson",20);
newList.add( new Animal("animal",20);
newList.add( new Animal("aAnimal",20);

list.sort(new Comparator<Nameable>() {
    public int compare(Nameable o1, Nameable o2) {
        return o1.getName().compareTo(o2.getName());
    }
});

接口及其用法:

Nameable.java

public interface Nameable {
    String getName();
}

public class Person implements Nameable {
   ...

   String getName() {
      return name;
   }

   ...
}

public class Animal implements Nameable {
   ...

   String getName() {
      return name;
   }

   ...
}

【讨论】:

    【解决方案2】:

    需要针对特定​​情况的抽象,以包含两个实体所需的所有信息。例如。一个名为Entity 的接口,它具有getName() 方法。

    例子:

    public interface Entity {
        String getName();
    }
    
    public class Person implements Entity {
    
    ...
        @Override
        public String getName() {
            return name;
        }
    }
    
    public class Animal implements Entity {
    
    ...
        @Override
        public String getName() {
            return name;
        }
    }
    

    得到这个后,你可以按类型使用它:

    List<Entity> entities = new ArrayList<>();
    entities.add(new Person("person", 20);
    entities.add(new Person("aPerson", 20);
    entities.add(new Animal("animal", 20);
    entities.add(new Animal("aAnimal", 20);
    entities.sort((o1, o2) -> o1.getName().compareTo(o2.getName());
    

    也可以使用abstract 类。

    【讨论】:

    • entities.sort((o1, o2) -> o1.getName().compareTo(o2.getName());
    • 这是一个 lambda 表达式,其作用与 @Pdb 中的示例相同。在这种情况下,它会覆盖Comparatorcompare 方法。检查thisthis
    • 是的,我试过了,我知道这是覆盖比较的捷径,但我第一次看到,非常感谢
    【解决方案3】:

    按照其他答案的建议创建基类/接口后,您可以使用Comparator.comparing 进行排序,

    newList.sort(Comparator.comparing(Entity::getName));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 2022-12-13
      相关资源
      最近更新 更多