Как отсортировать 2 объекта из 2 классов по 1 объекту - PullRequest
0 голосов
/ 24 апреля 2020

Предположим, у меня есть два класса:

класс 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;
    }
}

И я создаю объект List для сохраненных 2 классов Person и Животное

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);

Теперь я хочу отсортировать newList по name, но я не знаю, как это сделать. С одним классом я могу создать класс SortByName и сравнить имя между двумя объектами, но с двумя классами я не могу

Ответы [ 3 ]

2 голосов
/ 24 апреля 2020

Что вам нужно, это Interface. Оба класса Animal и Person предлагают name в качестве одного из своих свойств, так что вы можете иметь Interface скажем Nameable в этом отношении, чтобы по существу указать, что у вашего класса определенно есть свойство 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;
   }

   ...
}
1 голос
/ 24 апреля 2020

После создания базового класса / интерфейса, как предлагается в других ответах, вы можете сортировать как Comparator.comparing,

newList.sort(Comparator.comparing(Entity::getName));
1 голос
/ 24 апреля 2020

Требуется абстракция для этого конкретного c случая, которая содержит всю информацию, которая нужна обеим сущностям. Например интерфейс с именем 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 класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...