Как отсортировать java.util.ArrayList <ParentType>на основе ChildType? - PullRequest
4 голосов
/ 29 сентября 2011
public interface Human<T> extends Comparable<T>{ }

public class Men implements Human<Men>{
  public Men(String firstName) {
    this.firstName = firstName;
  }
.....
}

public class Women implements Human<Women>{
 public Women(String firstName) {
    this.firstName = firstName;
  }
.....
}

public class MainTest{

   public static void main(String[] args) {

      List<Human> engineers= new ArrayList<Human>();
        engineers.add(new Men("A")); 
            engineers.add(new Women("A"));
        engineers.add(new Men("C"));
        engineers.add(new Men("E"));
        engineers.add(new Men("Z"));
            engineers.add(new Women("J"));
        engineers.add(new Women("B"));
        engineers.add(new Men("X"));
        engineers.add(new Men("O"));
        engineers.add(new Women("G"));   

       Collections.sort(engineers);

       System.out.println(.... print the engineers array...)
}

Выход

Мужчины (A);Мужчины (C);Мужчины (E);Я нет);Мужчины (X);Мужчины (Z) Женщины (A);Женщины (В);Женщины (G);Женщины (AJ);

Мой отсортированный массив должен быть initially sorted in terms of the TYPE (Men or Women) and the secondary sort is based on firstname.Как мне лучше всего это сделать?

Я пытался Collections.sort(....)

Не удалось получить желаемый результат.

Заранее спасибо

Ответы [ 6 ]

3 голосов
/ 29 сентября 2011

Вы, вероятно, имеете в виду

public interface Human extends Comparable<Human> {}

То есть: человек сравним с другими людьми. В таком случае, если вы хотите сравнить людей на основе типа, за которым следует имя, тогда ваш интерфейс человек должен выразить оба этих свойства:

public interface Human extends Comparable<Human> {
    enum Type { MAN, WOMAN }
    Type getType();
    String getName();
}

Затем напишите соответствующую реализацию compareTo(), чтобы учесть и тип, и имя, и используйте Collections.sort() для сортировки.

2 голосов
/ 29 сентября 2011
class HumanComparator implements Comparator<Human>{

@Override
public int compare(Human humanObj1, Human humanObj2) {
    int index;
    if(humanObj1 instanceof Men && humanObj2 instanceof Men){
        String firstName1 = humanObj1.getFirstName();
        String firstName2 = humanObj2.getFirstName();
        index = firstName1.compareTo(firstName2);
    }else if(humanObj1 instanceof Women && humanObj2 instanceof Women){
        String firstName1 = humanObj1.getFirstName();
        String firstName2 = humanObj2.getFirstName();
        index = firstName1.compareTo(firstName2);
    }else if(humanObj1 instanceof Men && humanObj2 instanceof Women){
        index =-1;
    }else if(humanObj1 instanceof Women && humanObj2 instanceof Men){
        index =+1;
    }else{
        index =0;
    }
    return index;
}

}

, и вы можете отсортировать коллекцию, используя ниже:

  Collections.sort(engineers ,new HumanComparator());
2 голосов
/ 29 сентября 2011

Реализация компаратора based on Ryan Stewart's solution.Прекрасно работает!

Collections.sort(engineers, new Comparator<Human>() {
    @Override
    public int compare(Human o1, Human o2) {
        if(o1.getType().equals(o2.getType())) {
            return o1.getFirstName().compareTo(o2.getFirstName());
        } else {
            return o1.getType().compareTo(o2.getType());
        }
    }
});
2 голосов
/ 29 сентября 2011

Вам необходимо использовать компаратор и Collections.sort(List l, Comparator c)

static final Comparator<Human> MyComparator =
                                 new Comparator<Human>() 
{
    public int compare(Human e1, Human e2) 
    {
            // Your custom comparison code goes here
    }
};

Collections.sort(engineers, MyComparator);

Дополнительную информацию можно найти в руководстве по упорядочению объектов: http://download.oracle.com/javase/tutorial/collections/interfaces/order.html

1 голос
/ 29 сентября 2011

Вы, ребята, рекомендуете это?

public class HumanComparator implements java.util.Comparator<HumanBeings> {

    @Override
    public int compare(HumanBeings o1, HumanBeings o2) {
        if(o1 instanceof Men && o2 instanceof Men)
            return 0;
        else if(o1 instanceof Men && o2 instanceof Women)
            return -1;
        else if (o1 instanceof Women && o2 instanceof Men)
            return 1;

        return 0;

    }
}

.... и добавить дополнительный код для дальнейшей сортировки по имени ...

0 голосов
/ 29 сентября 2011

Я рекомендую использовать интерфейс «Компаратор».
Напишите другой класс, который реализует этот интерфейс.
Затем в методе сравнения напишите соответствующий код, который проверяет экземпляр, а затем член экземпляра.

...