Vectoren abhängig voneinander sortieren

  • Themenstarter Themenstarter ich²
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
I

ich²

Gast
Guten Morgen Forum,

wie kann ich zwei Vectoren abhänig voneinander sortieren? Die beiden sehen z. B. so aus

Vec 1

"Hallo"
"ABC"
"Z"
"Wurst"

Vec 2

"sagt horst"
"DEF"
"A"
"haut"

Jetzt soll Vec 1 sortiert werden, praktisch so

"ABZ"
"Hallo"
"Wurst"
"Z"

und Vec 2 soll mitsortiert werden, damit die Indices praktisch die selben bleiben

"DEF"
"sagt horst"
"haut"
"A"

Hab ein wenig mit Sortieralgorithmen rumgespielt, aber wie ichs auch versuche, ich bekomme es nicht gebacken dass der Vec 2 genauso sortiert wird wie Vec 1. Ist bestimmt ganz simpel nur ich stell mich vermutlich wieder zu blöd an

mfg

ich²
 
Du könntest deine Elemente in eine SortedMap legen dann wäre der Inhalt von vec1 dein Key und von vec2 deine values:

Code:
    SortedMap map = new TreeMap();
    for (int i = 0; i < vec1.size(); i++) {
      map.put(vec1.get(i), vec2.get(i));
    }
 
Danke für deine Antwort.

Da gibt sich aber ein Problem. in Vec 1 kann zweimal der selbe Eintrag stehen, aber an den selben stellen in Vec 2 steht etwas anderes. Sry, hatte ich vergessen dazu zu schreiben.

mfg

ich²
 
Warum nimmst Du überhaupt zwei Vectoren ?

Wenn Du ein eigenes Object machst und es in einen Vector packst, hättest Du wahrscheinlich weniger Problem:

Code:
class MyVectorContent {
  private String string1;
  private String string2;

  public MyVectorContent( String string1, String string2 ) {
    this.string1 = string1;
    this.string2 = string2;
  }

  public String getString1() {
    return this.string1;
  }

  public String getString2() {
    return this.string2;
  }
}

Und dass dann in den Vector. Für's Sortieren schreibst Dir noch nen Comparator und fertig biste.
 
Guten Morgen,

danke! Das ist genial. Ich sollte wohl anfangen ein wenig über meinen Tellerrand hinaus zu schauen. Ich habe aber leider noch nie etwas mit Comparator gemacht und floglich auch kA wie sowas funktionert. Kann mir da evtl. jemand unter die Arme greifen?

mfg

ich²
 
Dazu musst Du
a) entweder das Interface Comparable in der Klasse MyVectorContent implementieren

b) oder eine neue Klasse schreiben, welche das Interface Comparator implementiert

Dann einfach bei
a)
Code:
Collections.sort(myVector);
b)
Code:
Collections.sort(myVector, myVectorContentComparator);
aufrufen.
 
Hallo sky,

soweit hatte ich das auch schon, mein Problem lag eher daran, was in der Methode

Code:
compareTo

stehen muss. Daraus werde ich nicht schlau ???:L

mfg

ich²
 
Zum Bespiel:
Code:
return string1.compareTo( anotherString1 )

anotherString1 kommt dann von dem Paramter Object der Methode "compareTo" (bspw. getString1 aufrufen)
 
Warum nicht einfach die Suchfunktion

MAn wird von Threads erschlagen, wenn man nach compareTo oder Comparable sucht...

man muss nicht immer wieder alles neu fragen !!
 
Danke an euch beide (sky und dbac), ich scheine aber zu dämlich zu sein mir soetwas zu schreiben. Hab da den ganzen Mittag versucht und rumprobiert, habs aber net hinbekommen. Hobbit (arbeitet ja mit mir in einer Firma) konnte mir da auch net weiterhelfen 🙁.

mfg

ich²
 
Hol dir die erst bessere QuickSort Implementierung (z.B. unter ...jdk###\demo\applets\SortDemo ist eins dabei)
und erweitere die Parameterliste um den zweiten Vector.
Eigentlich brauchst du dann nur die Stellen anzupassen, wo die Einträge im Vector vertauscht werden und wo
der rekursive Aufruf erfolgt. (Methoden Swap und Quicksort)
 
Guten Abend

@ L-ectron-X

nein, hab leider noch keine Lösung

@ Gast

habe bereits selber einen Quicksort geschrieben, aber ich schau mal ob ich damit was anfangen kann. Thx.

mfg

ich²
 
Frisch aus der API was zur compareTo-Methode des Comparators:
a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.

Und etwas mathematischer:
compare( a, b ) ist...
< 0 falls a < b
= 0 falls a = b
> 0 falls a > b
 
@Beni
Das mit dem Comparator hilft ihm nicht weiter, da man beim Comparator nicht zwei
Indizies zum Vergleich übergeben kriegt, sondern zwei Objekte. Woher die kommen,
erfährst du im Comparator nicht.
Kurz: Eigene Sortierung notwendig. Wie ich bereits oben schrieb, einfach Quicksort erweitern.

:shock: Es sei denn, ich bin jetzt total auf dem Schlauch.
 
Die Kombination der Objekte in den beiden Vectoren zu einem Objekt (wie von Sky vorgeschlagen), hat der "ich" doch als Lösung akzeptiert?

Ein eigener Quicksort schreiben ist total übertrieben!

Ich kann ja noch ein bisschen Quellcode anhängen, um eine Lösungsidee zu verdeutlichen:
Code:
// Die Liste der Doppelelemente, wie von sky vorgeschlagen
// Diese Liste kann mit einer einzigen for-Schleife aus den beiden
// Vectoren erzeugt werden.
List<MyVectorContent> list = ...

// Comparator der nach dem ersten, dann nach dem zweiten
// String vergleicht
Comparator<MyVectorContent> comp = new Comparator<MyVectorContent>(){
  public int compare( MyVectorContent a, MyVectorContent b ){
    int result = a.getString1().compareTo( b.getString1() );
    if( result == 0 )
       result = a.getString2().compareTo( b.getString2() );
    return result;
  }
};

// Die Liste sortieren
Collections.sort( list, comp );

// Die Elemente der Liste könnte man jetzt in die
// beiden Vectoren zurückschreiben...

[Edit]
Man könnte in der Liste auch die Indices speichern (einfach ein paar Integer reinschieben), und der Comparator schaut in den beiden Vectoren nach, was dort steht! Danach wären halt nur die Indices sortiert.

Code:
List<Integer> indices = ... // alle Indices

final Vector<X> vector1 = ...
final Vector<Y> vector2 = ...

Comparator<Integer> comp = new Comparator<Integer>(){
  public int compare( Integer a, Integert b ){
     if( vector1.get( a ) < vector1.get( b ))
       return -1;
     else if( ... == ... ){
       if( vector2.get( a ) < vector2.get( b ) )
         return -1;
       else if ...
       else ...
     }
     else ...
  }
};

Collections.sort( indices, comp );
 
Beni hat gesagt.:
Die Kombination der Objekte in den beiden Vectoren zu einem Objekt (wie von Sky vorgeschlagen), hat der "ich" doch als Lösung akzeptiert?
...
:autsch: Sorry, der Schlauch ist wieder frei. :wink:
Ich sollte alle Antworten lesen, bevor ich was vorschlage. Klar, ist die elegantere Lösung, wenn die Dinger
schon mal zusammen gehören. Irgendwie habe ich an einen ähnlichen Fall denken müssen, wo ich mehrere
unterschiedliche Listen anhand einer weiteren Liste sortieren musste. Das habe ich mit Quicksort gelöst,
um keine zusatzlichen "Container" für die Daten erstellen zu müssen.
 
Guten Morgen Forum,

vielen Dank für eure Hilfe, hat wunderbar funktioniert!

mfg

ich²
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben