Vector sortieren

Uwe0911

Grünschnabel
Hallo,
bin noch Anfänger in Java und stehe vor einem Problem.
Ich habe in einem Vector v1 Einträge aus einer Struktur gespeichert.

public class Struktur {
String s1;
double zahl;
String dauer;
double ergebnis;

/**
* @return Returns the punkte.
*/
public double getErgebnis() {
return ergebnis;
}

..... usw.

Wie bekomme ich den Vector sortiert?

Ich danke euch.

Gruß

Uwe
 
Hallo,

schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import java.util.Collections;
import java.util.Vector;

/**
 * @author Tom
 */
public class CollectionSortExample {

  /**
   * @param args
   */
  public static void main(String[] args) {
    Vector<Person> persons = new Vector<Person>();
    persons.add(new Person("Stefan", 12));
    persons.add(new Person("Dietmar", 12));
    persons.add(new Person("Jürgen", 20));
    persons.add(new Person("Thomas", 23));
    persons.add(new Person("Thomas", 2));

    Collections.sort(persons);
    System.out.println(persons);
  }

  static class Person implements Comparable<Person> {
    String name;
    int age;


    /**
     * @param name
     * @param age
     */
    public Person(String name, int age) {
      super();
      this.name = name;
      this.age = age;
    }


    @Override
    public int hashCode() {
      final int prime = 31;
      int result = 1;
      result = prime * result + age;
      result = prime * result + ((name == null) ? 0 : name.hashCode());
      return result;
    }


    /*
     * (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
      if (this == obj) return true;
      if (obj == null) return false;
      if (getClass() != obj.getClass()) return false;
      final Person other = (Person) obj;
      if (age != other.age) return false;
      if (name == null) {
        if (other.name != null) return false;
      } else if (!name.equals(other.name)) return false;
      return true;
    }


    public int compareTo(Person o) {
      //First order by name
      int result = name.compareTo(o.name);
      if (0 == result) {
        //if names are equal order by age, youngest first
        result = age - o.age;
      }
      return result;
    }


    @Override
    public String toString() {
      return this.name + ": " + this.age;
    }
  }
}

Ausgabe:
Code:
[Dietmar: 12, Jürgen: 20, Stefan: 12, Thomas: 2, Thomas: 23]

Gruß Tom
 
Hat geklappt. Jetzt muss ich mal sehen das ich die Sortierung nach dem Namen ausschalte und nach den Punkten sortiere.
 
Hallo,

bin auch noch Neuling in java.
Der Thread hat mir ein bisschen weitergeholfen.

Aber wie muss ich jetzt vorgehen, wenn der Benutzer unterschiedliche Sortierkriterien wählen darf? Im Beispiel von Thomas wird ja erst nach dem Namen sortiert.

Und wie schaut das ganze mit TreeSets aus? Kann ich die für diesen Zweck auch einsetzen?

Habe ein bisschen mit TreeSets rumprobiert und für jedes Sortierkriterium eine eigene Klasse geschrieben (also eine für Alter und eine für Name). Beide Klassen implementieren das Interface Comparator und unterscheiden sich durch ihre compare Methode.

Aber wenn ich jetzt new Person("Klaus", 42) und new Person("Klaus", 43) dem TreeSet hinzufüge fliegt einer raus, weil die Vornamen gleich sind (aber die Objekte ja nicht!). Muss ich da auch noch irgendwo eine equals-Methode überschreiben?

Vielen Dank
 
Hallo,

dafür hast du ja die Comparator. Ich denke mal, dass einer rausfliegt, weil der Klaus heißt. Das heißt nämlich, dass er bei deinem Namens-Comparator gleich ist.

Poste mal bitte deinen Code.

MFG

zEriX
 
Ok, hier der (zusammengefasste) Code.
Erstes Sortierkriterium soll der Vorname sein, zweites der Nachname:

Code:
public class VornameVorwaerts implements Comparator {
   public int compare(Object o1, Object o2) {
      int result = ((Benutzer)o1).vorname.compareTo(((Benutzer)o2).vorname);
      if(result == 0) {
         result = ((Benutzer)o1).nachname.compareTo(((Benutzer)o2).nachname);
      }
      return result;
   }
}

Code:
TreeSet alleBenutzer = new TreeSet(new VornameVorwaerts());

alleBenutzer.add(new Benutzer("Klaus", "Meier"));
alleBenutzer.add(new Benutzer("Klaus", "Weber"));

Iterator it = alleBenutzer.iterator();

while(it.hasNext()) {
   out.print(((Benutzer)it.next()).vorname);
}

Ausgabe:

Klaus


Der Code ist abgetippt. Gut möglich, dass ein paar Rechtschreibfehler drin sind.

Noch eine Frage hinterher: Wenn ich ein TreeSet habe, dass bereits sortierte Benutzer enthält, kann ich es dann irgendwie nach einem anderen Sortierkriterium neu sortieren lassen? Bisher erstelle ich nämlich ein neues TreeSet und übergebe dem Konstruktor sozusagen ein neues Sortierkriterium (z. B. Nachname absteigend). Danach muss ich aber dann die "Benutzer reinkopieren". Das geht bestimmt einfacher.
 
Zuletzt bearbeitet:
ok, ich habe gerade gesehen, dass man der Methode Collections.sort() ja noch den Comparator mitgeben kann. Ich werde es also doch wie Thomas es gezeigt hat mit einem Vector statt mit einem TreeSet machen. Und mit sort kann ich dann hoffentlich auch immer den Vector neu sortieren nach unterschiedlichen Kriterien.
 
Zurück