3 Stimmen

Wie sortiere ich ein java.util.ArrayList<ParentType> nach ChildType?

public interface Human extends Comparable{ }

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

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

public class MainTest{

   public static void main(String[] args) {

      List engineers= new ArrayList();
        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...)
}

Ergebnis

Men(A); Men(C); Men(E); Men(O); Men(X); Men(Z) Women(A); Women(B); Women(G); Women(AJ);

Meine sortierte ArrayList sollte zunächst nach dem TYP (Men oder Women) und dann nach dem Vornamen sortiert sein. Wie kann ich das am besten erreichen?

Ich habe versucht, Collections.sort(....)

Ich habe nicht die gewünschten Ergebnisse erhalten.

Vielen Dank im Voraus

2voto

Ryan Stewart Punkte 120600

Sie meinen wahrscheinlich

public interface Human extends Comparable {}

Das heißt: Ein Mensch ist vergleichbar mit anderen Menschen. In diesem Fall, wenn Sie Menschen nach Typ und Name vergleichen möchten, muss Ihr Interface Human beide Eigenschaften ausdrücken:

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

Schreiben Sie dann eine geeignete Implementierung von compareTo(), um sowohl Typ als auch Name zu berücksichtigen, und verwenden Sie Collections.sort() zum Sortieren.

1voto

Brian Roach Punkte 74523

Sie müssen einen Comparator verwenden und Collections.sort(List l, Comparator c)

static final Comparator MeinComparator =
                                 new Comparator() 
{
    public int compare(Mensch e1, Mensch e2) 
    {
            // Ihr individueller Vergleichscode kommt hierhin
    }
};

Collections.sort(ingenieure, MeinComparator);

Zusätzliche Informationen finden Sie im Tutorial zur Objektordnung: http://download.oracle.com/javase/tutorial/collections/interfaces/order.html

1voto

Akh Punkte 5842

Empfehlt ihr das?

public class HumanComparator implements java.util.Comparator {

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

    }
}

.... und füge mehr Code hinzu, um nach dem Vornamen weiter zu sortieren...

1voto

Bhesh Gurung Punkte 49812

Implementierung des Vergleichers basierend auf der Lösung von Ryan Stewart. Funktioniert super!

Collections.sort(engineers, new Comparator() {
    @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());
        }
    }
});

1voto

Satya Punkte 7886
class HumanComparator implements Comparator{

@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;
}

}

und Sie können die Sammlung mit folgendem sortieren :

  Collections.sort(engineers ,new HumanComparator());

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X