Objekte in ArrayList vertauschen :(

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo, ich habe eine folgende, sortierte Datenstruktur in einer Liste mit unterschiedlichen Objekten:

A
--
B
B
B
--
C
C
C
C
C
--
D
D
D
D
D

Nun sollen alle C Objekte mit denen von B in der Reihenfolge getauscht werden. Ich hab das irgendwie mit BubbleSort probiert aber das haut nicht hin. Kriege immer eine ConcurrentModificationException :(
Wer kann mir helfen.
 
G

Gast

Gast
Also spontan würde mir jetzt keine Möglichkeit einfallen das automatisch zu sortieren. Ich würde ne Methode schreiben die ne neue ArrayList erstellt und in diese würde ich die Objekte dann in der richtigen Reihenfolge einfügen.
 

mikachu

Top Contributor
dat geht mit
Code:
Collections.sort( arraylistInstance, comparatorInstance );

musst dir nur einen eigenen Comparator schreiben
 
G

Guest

Gast
danach hab ich auch schon geforscht. aber das haut nicht hin.
Code:
		    Collections.sort(list, new Comparator<Elements>() {

				public int compare(Element o1, Element o2) {
					// TODO Auto-generated method stub
					return o1.getID().compareTo(o2.getID());
				}
		    	
		    });

Also ich weiß nicht, wie ich das richtig vergleichen soll (Kriterien). Zum Beispiel haben alle Objekte eine ID die A,B,C oder D zurückgibt. Nach diesem Ansatz passiert leider nichts ;(
 
G

Gast

Gast
Klar da musst du dann schon manuell in der Methode prüfen sonst hat er halt A<B<C<D und daher wird die Reihenfolge immer gleich bleiben.
 

Marco13

Top Contributor
Das ist jetzt doch nicht so einfach, wie es auf den ersten Blick aussieht. Also, es ist schon einfach, aber nicht mit Collections.sort. Eigentlich dachte ich "Och, das sort ist ja 'stable', da muss man nur im Comparator an den passenden Stellen 0 zurückgeben, dann passt das schon" ... aber bei genauerem Hinsehen habe ich keine einfachere Möglichkeit gefunden, als die "Intervalle" der beiden IDs zu bestimmen, und die Liste dann neu zusammenzubauen :? Da müßte es aber eigentlich eine geschicktere Möglichkeit geben, nur spontan fällt mir keine ein. Naja. Das mit den Intervallen ist nicht "schlecht" (Laufzeit O(n), Speicher O(2n)), aber sieht irgendwie umständlich aus... Vielleicht hat ja jemand noch eine schönere Lösung.

Code:
import java.util.*;

class Element
{
    private int id;

    public Element(int id)
    {
        this.id = id;
    }

    public int getID()
    {
        return id;
    }

    public String toString()
    {
        return String.valueOf(id);
    }
}



class SortTest2
{
    public static void main(String args[])
    {
        List<Element> list = new ArrayList<Element>();
        list.add(new Element(1));
        list.add(new Element(2));
        list.add(new Element(2));
        list.add(new Element(3));
        list.add(new Element(3));
        list.add(new Element(3));
        list.add(new Element(4));
        list.add(new Element(4));
        list.add(new Element(4));
        list.add(new Element(4));
        list.add(new Element(5));
        list.add(new Element(5));
        list.add(new Element(5));
        list.add(new Element(5));
        list.add(new Element(5));

        System.out.println("Before "+list);
        swapID(list, 2, 4);
        System.out.println("After  "+list);
    }

    private static void swapID(List<Element> list, final int lo, final int hi)
    {
        int lo0 = -1;
        int lo1 = -1;
        int hi0 = -1;
        int hi1 = -1;
        for (int i=0; i<list.size(); i++)
        {
            Element e = list.get(i);
            if (e.getID() == lo)
            {
                if (lo0 == -1)
                {
                    lo0 = i;
                }
                lo1 = i;
            }
            if (e.getID() == hi)
            {
                if (hi0 == -1)
                {
                    hi0 = i;
                }
                hi1 = i;
            }
        }
        List<Element> result = new ArrayList<Element>();
        for (int i=  0;   i< lo0;         i++) { result.add(list.get(i)); }
        for (int i=hi0;   i<=hi1;         i++) { result.add(list.get(i)); }
        for (int i=lo1+1; i< hi0;         i++) { result.add(list.get(i)); }
        for (int i=lo0;   i<=lo1;         i++) { result.add(list.get(i)); }
        for (int i=hi1+1; i< list.size(); i++) { result.add(list.get(i)); }
        list.clear();
        list.addAll(result);
    }

}

Du solltest aber ggf. mal überlegen, ob du das, was du da machst, nicht auch anders modellieren kannst... Und falls nicht, und falls do obigen Test verwendest, genauer prüfen, was passiert/passieren soll, wenn die IDs nicht enthalten sind, oder am Rand liegen usw...
 
S

SlaterB

Gast
also das compare ist wirklich nicht schwer, falls du das meinst,
dabei ist auch egal, ob stable, vorsortiert oder sonstwas

Code:
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        List<String> list = new ArrayList<String>();
        Collections.addAll(list, "A", "B", "B", "C", "C", "C", "D");
        Collections.sort(list, new Comparator<String>()
            {
                public int compare(String o1, String o2)
                {
                    int c = o1.compareTo(o2);
                    if ((o1.equals("B") && o2.equals("C")) || (o1.equals("C") && o2.equals("B")))
                    {
                        c = -c;
                    }
                    return c;
                }
            });

        System.out.println(list);
    }

}
 

Marco13

Top Contributor
Nicht so ganz. Einen ähnlichen Ansatz hatte ich auch probiert. Und vermutlich hätte ich auch gedacht, dass es funktioniert, wenn ich eine andere Eingabe verwendet hätte (nämlich so eine wie du). Aber mit anderem Inhalt, und dem Versuch, B und D zu vertauschen, funktioniert das nichtmehr....
Code:
class SortTest3
{
    public static void main(String[] args)
        throws Exception
    {
        List<String> list = new ArrayList<String>();
        //Collections.addAll(list, "A", "B", "B", "C", "C", "C", "D");
        Collections.addAll(list, "A", "B", "B", "C", "C", "C", "D", "D", "D", "D", "E", "E", "E", "E", "E");
        Collections.sort(list, new Comparator<String>()
            {
                public int compare(String o1, String o2)
                {
                    int c = o1.compareTo(o2);
                    if ((o1.equals("B") && o2.equals("D")) || (o1.equals("D") && o2.equals("B")))
                    {
                        c = -c;
                    }
                    return c;
                }
            });

        System.out.println(list);
    }
}
Das hängt wohl damit zusammen, dass jetzt nie mehr der Fall eintritt, dass zwei direkt nebeneinander liegende Elemente vertauscht werden müssen. Er läuft beim Sort sozusagen einmal durch die Liste (das kann man sich mit Debug-Ausgaben ansehen: 14 Vergleiche bei 15 Listenelementen), und stellt bei jedem Vergleich fest, dass alles in Ordnung ist.... Für genaueres müßte man sich die sort-Implementierung wohl mal genauer ansehen...
 
G

Gast

Gast
Das kann funktionieren. Man darf aber nicht nur eine Regel definieren man muss alle Fälle abdecken.
 

Marco13

Top Contributor
Ja, natürlich... man kann dem Comparator eine Liste übergeben, mit der gewünschten ID-Reihenfolge, und dann sowas machen wie
return idList.indexOf(e0.getID()) - idList.indexOf(e1.getID());
aber effizient wäre das vmtl. nicht, und solche Fragen wie ob ALLE möglichen IDs bekannt sind (oder aufgelistet werden können) wären ja noch zu klären....
 
G

Gast

Gast
Es gäbe da noch ne ganz üble Lösung. Man prüft die ID und wenn diese "C" ist setzt man sie auf "AC", vergleicht dann und setzt dann wieder zurück auf "C". Ist zwar keine saubere Lösung aber es funktioniert ;)
 
S

SlaterB

Gast
> Das hängt wohl damit zusammen

das hänt wohl damit zusammen, dass B < C nicht korrigiert wird,
mann muss dann neben B und D auch B und C sowie C und D gesondert behandeln,

macht aber mit if schon keinen Sinn mehr, da bietet sich dann wirklich die Liste der Reihenfolge an, wenn möglich

edit: noch eine Idee gerade wieder wegeditiert

edit2:
nun noch mal korrigiert:

noch ein guter Trick, der es wieder einfacher macht und auch für beliebig viele Elemente klappt:
Code:
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        List<String> list = new ArrayList<String>();
        Collections.addAll(list, "A", "B", "B", "C", "C", "C", "D", "E");
        Collections.sort(list, new Comparator<String>()
            {
                public int compare(String o1, String o2)
                {
                    if (o1.equals("B"))
                    {
                        o1 = "D";
                    }
                    else if (o1.equals("D"))
                    {
                        o1 = "B";
                    }
                    if (o2.equals("B"))
                    {
                        o2 = "D";
                    }
                    else if (o2.equals("D"))
                    {
                        o2 = "B";
                    }

                    return o1.compareTo(o2);
                }
            });

        System.out.println(list);
    }

}
weiß nicht ob das gast eben meinte, dann nur Konkretisierung ;)
 

Marco13

Top Contributor
Hm. Für Strings mag sowas gehen (habs nicht getestet), aber ob man "mal kurz" ein Element mit einer beliebigen ID erzeugen kann, ist auch nicht klar. Trotz allem wird kein Verfahren, dass auf einer Sortierung aufbaut, schneller laufen können als die (etwas umständliche) O(n)-Lösung....
 
G

Guest

Gast
Hallo und Danke für die Diskussion!

also ein Kollege hat mir zwischenzeitlich geholfen und da hat sich herausgestellt, dass mein kompletter Ansatz für die gegebene Datenstruktur schon falsch war und alles viel viel einfacher geht. Ich will das genaue Problem jetzt nicht alles runterschreiben aber wie schon ein Hinweis von Marco13 kam:

prüfen ob das nicht anders geht bzw. aufgebaut oder modelliert werden kann. Und das war hier der Fall. Da hätte ich mir die ganzen Sortiergedanken sparen können. Toll ;(

Der Hintergrund war der, dass die gegeben Struktur eine Baumstruktur ist und dann anders dargestellt werden sollte. Alles verstanden habe ch das nicht, aber es ist schonmal beruhigend, dass es doch einfach wie zunächst gedacht sein kann.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
W Objekte einer ArrayList in txt-datei schreiben mit Paths? Java Basics - Anfänger-Themen 2
N Typebound Objekte einer Arraylist hinzufügen Java Basics - Anfänger-Themen 7
X Objekte einer ArrayList richtig ausgeben? Java Basics - Anfänger-Themen 8
V Collections Objekte einer ArrayList in der main() ausgeben Java Basics - Anfänger-Themen 9
X Objekte in ArrayList einfügen Java Basics - Anfänger-Themen 10
R Objekte zur Laufzeit in Schleife erzeugen und in ArrayList ablegen Java Basics - Anfänger-Themen 4
N Objekte in ArrayList finden Java Basics - Anfänger-Themen 10
G Datentypen verschiedene Objekte in eine ArrayList, Generics Java Basics - Anfänger-Themen 2
S Objekte in ArrayList eintragen und auslesen Java Basics - Anfänger-Themen 7
A Objekte einer ArrayList auslesen und auf der Konsole ausgeben Java Basics - Anfänger-Themen 2
D Klassen Objekte nach erstellung in ArrayList speichern Java Basics - Anfänger-Themen 5
T gemeinsame Methode für ArrayList vererbter Objekte Java Basics - Anfänger-Themen 6
L Auf Objekte in Arraylist zugreifen Java Basics - Anfänger-Themen 6
G Methoden Alle Objekte der ArrayList ausgeben funktioniert nicht. Java Basics - Anfänger-Themen 12
G Objekte aus ArrayList in StringArray konvertieren?! Java Basics - Anfänger-Themen 13
S ArrayList oder die Objekte in H2 Database speichern Java Basics - Anfänger-Themen 11
W bestimmte Objekte in ArrayList auslesen Java Basics - Anfänger-Themen 8
C Methoden Objekte mit Hilfe einer Schleife in einer ArrayList erzeugen Java Basics - Anfänger-Themen 26
bluerob generische ArrayList -> erbende Objekte auslesen Java Basics - Anfänger-Themen 24
A ArrayList bzw. Objekte übergeben Java Basics - Anfänger-Themen 6
X Collections Reihenfolge bestimmter Objekte in einer ArrayList verändern Java Basics - Anfänger-Themen 2
S Objekte aus Arraylist richtig ansprechen Java Basics - Anfänger-Themen 5
I OOP Objekte in einer ArrayList Java Basics - Anfänger-Themen 5
C Objekte in ArrayList Java Basics - Anfänger-Themen 6
I Objekte aus arrayList Java Basics - Anfänger-Themen 2
D X Werte in ArrayList von Point Objekte alle gleich ? Java Basics - Anfänger-Themen 11
R ArrayList Objekte verschwinden Java Basics - Anfänger-Themen 8
D Objekte auf Knopfdruck in Arraylist erzeugen Java Basics - Anfänger-Themen 2
M Objekte mit Schleife in ArrayList erstellen? Java Basics - Anfänger-Themen 6
T Probleme mit ArrayList, in der Objekte gespeichert sind, die ArrayLists enthalten Java Basics - Anfänger-Themen 2
Semox Sind Objekte in einer ArrayList überschreibbar? Java Basics - Anfänger-Themen 2
J Datensätze aus einer DB als Objekte erzeugen und in ArrayList abspeichern Java Basics - Anfänger-Themen 9
M Objekte aus einer Arraylist löschen Java Basics - Anfänger-Themen 7
L Objekte in einer ArrayList vergleichen Java Basics - Anfänger-Themen 19
H bestimmte objekte in ArrayList löschen? Java Basics - Anfänger-Themen 7
G Die Objekte eine ArrayList sortieren Java Basics - Anfänger-Themen 50
X Aus XML Datei Objekte in Arraylist laden - Fehler! Java Basics - Anfänger-Themen 9
H Objekte aus Text-Datei wieder in ArrayList laden Java Basics - Anfänger-Themen 8
A Objekte in ArrayList anhand Variable sortieren Java Basics - Anfänger-Themen 10
I Objekte in ArrayList Java Basics - Anfänger-Themen 3
E Zugriff auf Objekte in einer ArrayList Java Basics - Anfänger-Themen 3
B Objekte aus Datei auslesen und in ArrayList schreiben! Java Basics - Anfänger-Themen 25
J Objekte einer ArrayList in eine Tabelle einfügen Java Basics - Anfänger-Themen 2
I Zapier -> wie werden Objekte gespeichert? Java Basics - Anfänger-Themen 10
K Hab ich dass so richtig erklärt (Objekte und Referenzen)? Java Basics - Anfänger-Themen 5
J Objekte in JSON speichern?? Java Basics - Anfänger-Themen 1
I Objekte in ShareProject speichern um später zu nutzen Java Basics - Anfänger-Themen 4
J Objekte Java Basics - Anfänger-Themen 22
T Objekte mit arrays erstellen Java Basics - Anfänger-Themen 6
Hzrfa Objekte, Referenz Java Basics - Anfänger-Themen 5
T 3D Objekte verarbeiten Java Basics - Anfänger-Themen 2
N Welche Objekte kann man zu einem Set hinzufügen Java Basics - Anfänger-Themen 4
I XML einlesen und Objekte bekommen Java Basics - Anfänger-Themen 2
Encera Zugriff auf Map-Objekte Java Basics - Anfänger-Themen 3
E Objekte löschen Java Basics - Anfänger-Themen 9
P Array-Objekte-Aufruf Java Basics - Anfänger-Themen 22
Encera Auf Objekte aus anderer Klassen zugreifen Java Basics - Anfänger-Themen 20
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
B Objekte verschwinden beim Übersetzen Java Basics - Anfänger-Themen 5
D Zwei verschiedene Intellij Projekte, wie benutze ich wechselseitig objekte Java Basics - Anfänger-Themen 8
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
F Aus eingelesener Datei korrekt Objekte erzeugen Java Basics - Anfänger-Themen 5
G Übergeordnete Objekte abrufen Java Basics - Anfänger-Themen 9
B Bin komplett am verzweifeln :( Verkettete Liste die Objekte hat Attribut auslesen Java Basics - Anfänger-Themen 14
A Objekte mit Parametern in eine Liste packen Java Basics - Anfänger-Themen 19
B Objekte, bspw. konkret Arraylists,manuell aus Speicher löschen? Java Basics - Anfänger-Themen 70
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
D Wie Objekte im JFrame frei bewegen lassen? Java Basics - Anfänger-Themen 3
Spandeli8 Erzeugte Objekte gegenüber Bildern hervorheben in Java Processing Java Basics - Anfänger-Themen 1
J Zwei Objekte vergleichen Java Basics - Anfänger-Themen 8
L Werte von Objekte addieren Java Basics - Anfänger-Themen 14
U Objekte in LinkedList löschen und editieren Java Basics - Anfänger-Themen 14
W Objekte über Scanner Input; ToString Probleme... Java Basics - Anfänger-Themen 4
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
G Methoden Informationen aus zwei Objekte bekommen? Java Basics - Anfänger-Themen 6
P Globale Objekte Java Basics - Anfänger-Themen 2
C Nachträglich neue grafische Objekte hinzufügen Java Basics - Anfänger-Themen 7
D Interaktion zweier Objekte Java Basics - Anfänger-Themen 5
M Objekte in Array speichern und ausgeben Java Basics - Anfänger-Themen 17
S Objekte indiziert erstellen Java Basics - Anfänger-Themen 27
M Warum dürfen Objekte einer Klasse auf statische Variablen dieser Klasse referenzieren? Java Basics - Anfänger-Themen 10
M Objekte mittels equals vergleichen Java Basics - Anfänger-Themen 14
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
A (Objekte Java Basics - Anfänger-Themen 6
Y Klassen Klassen und Objekte Java Basics - Anfänger-Themen 3
Y Klassen Klassen und Objekte mit set und get Java Basics - Anfänger-Themen 0
U Objekte in einer LinkedList sortieren Java Basics - Anfänger-Themen 5
N Methode um Objekte einer Liste hinzuzufügen Java Basics - Anfänger-Themen 1
G Java Objekte auf Duplikate testen Java Basics - Anfänger-Themen 4
B Neue Liste erstellen, wenn Objekte bestimmte Referenz hat / Gruppierung von Einträgen Java Basics - Anfänger-Themen 12
M Implementieren einer Datenstruktur, welche nur 5 Objekte speichert Java Basics - Anfänger-Themen 3
M Objekte miteinander vergleichen Java Basics - Anfänger-Themen 18
C Verschiedene Objekte in einer Liste speichern Java Basics - Anfänger-Themen 6
J Java GUI- Objekte Position per Quelltext bestimmen Java Basics - Anfänger-Themen 4
G Objekte in Methoden? Java Basics - Anfänger-Themen 13
H Auf Objekte bzw Variabeln aus einer anderen Methode zugreifen Java Basics - Anfänger-Themen 7
S Frage Klasse und Objekte Java Basics - Anfänger-Themen 2
K Boolean in einer Methode um 2 Objekte zu vergleichen Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben