Android ArrayList sortieren mit 2 Werten ohne thencomparing , Wie?

T

tollewurst

Mitglied
Hallo,

da ich sehr stark abwärts kompatibel bleiben will mit der Api, hätte ich mal eine Frage, wie man eine ArrayList mit 2 Werten sortiert.
Also er soll erst nach id sortieren und dann nach Namen. z.b.

0 A
1 Aa
2 Ab
3 B
4 Ba
...

Wie ich nach ID sortiere weiß und nach Name auch, aber wie geht das gleichzeitig.

static class UebungenSort {
int mid;
String mname;

UebungenSort(int id, String name) {
mid = id;
mname = name;
}

String getName() {
return mname;
}

int getID() {
return mid;
}

public static Comparator<UebungenSort> UebungComparator = new Comparator<UebungenSort>() {
public int compare(UebungenSort s1, UebungenSort s2) {
String Uebungname1 = s1.getName().toUpperCase();
String Uebungname2 = s2.getName().toUpperCase();

//ascending order
return Uebungname1.compareTo(Uebungname2);

//descending order
//return StudentName2.compareTo(StudentName1);
}
};

public static Comparator<UebungenSort> IDComperator = new Comparator<UebungenSort>() {
public int compare(UebungenSort s1, UebungenSort s2) {
int id1 = s1.getID();
int id2 = s2.getID();

/*For ascending order*/
return id1 - id2;

/*For descending order*/
//rollno2-rollno1;
}
};
}

....

Collections.sort(uebungsort, UebungenSort.UebungComparator);
Collections.sort(uebungsort, UebungenSort.IDComperator );
 
krgewb

krgewb

Top Contributor
Bitte immer in Code-Tags posten.
Java:
static class UebungenSort {
    int mid;
    String mname;

    UebungenSort(int id, String name) {
        mid = id; 
        mname = name;
    }

    String getName() {
        return mname;
    }

    int getID() {
        return mid;
    }

    public static Comparator<UebungenSort> UebungComparator = new Comparator<UebungenSort>() {
        public int compare(UebungenSort s1, UebungenSort s2) {
            String Uebungname1 = s1.getName().toUpperCase();
            String Uebungname2 = s2.getName().toUpperCase();

            //ascending order
            return Uebungname1.compareTo(Uebungname2);

            //descending order
            //return StudentName2.compareTo(StudentName1);
        }
    };

    public static Comparator<UebungenSort> IDComperator = new Comparator<UebungenSort>() {
        public int compare(UebungenSort s1, UebungenSort s2) {
            int id1 = s1.getID();
            int id2 = s2.getID();

            /*For ascending order*/
            return id1 - id2;

            /*For descending order*/
            //rollno2-rollno1;
        }
    };
}

....

Collections.sort(uebungsort, UebungenSort.UebungComparator);
Collections.sort(uebungsort, UebungenSort.IDComperator );
 
H

httpdigest

Top Contributor
Wenn du nach mehreren Kriterien sortieren willst, musst du dir erstmal vor Augen führen, was genau das denn heisst. Wenn du nach Kriterium C1 und C2 (in dieser Reihenfolge) sortieren willst, dann heisst das nichts anderes als dass Kriterium C2 nur dann herangezogen wird, wenn für C1 "unentschieden" bzw. "sind gleich" herauskommt. Z.B.: {id=0, name="a"} und {id=0, name="b"} sind für den ID-Vergleich ja "gleich", da beide id=0 besitzen. Somit entscheidet das nächste Kriterium über den Vergleich.
Mit diesem Wissen kannst du dann auch ganz einfach eine eigene "comparingBy"-Methode implementieren, die beliebig viele Comparatoren entgegennehmen kann und danach sortiert:
Java:
public static <T> Comparator<T> comparingBy(Comparator<T>... comparators) {
  return new Comparator<T>() {
    public int compare(T o1, T o2) {
      for (int i = 0, r = 0; i < comparators.length; i++)
        if ((r = comparators[i].compare(o1, o2)) != 0)
          return r;
      return 0;
    }
  };
}
 
T

tollewurst

Mitglied
na eigentlich will ich sowas
Comparator<Employee> compareByName = Comparator
.comparing(Employee::getFirstName)
.thenComparing(Employee::getLastName);

ohne Java 8 bzw. in Android API 24+ gelöst haben.
 
H

httpdigest

Top Contributor
Na, und genau das hab ich dir geschrieben. Du kannst (offensichtlich) ja nicht die eingebaute Comparator-Klasse selbst anpassen (also comparing() oder thenComparing() hinzufügen).

Vielleicht nochmal die Benutzung zur Verdeutlichung:
Java:
// Die neue Methode von oben
public static <T> Comparator<T> comparingBy(final Comparator<T>... comparators) {
  return new Comparator<T>() {
    public int compare(T o1, T o2) {
      for (int i = 0, r = 0; i < comparators.length; i++)
        if ((r = comparators[i].compare(o1, o2)) != 0)
          return r;
      return 0;
    }
  };
}
// nur byId
private static final Comparator<UebungenSort> byId = new Comparator<UebungenSort>() {
  public int compare(UebungenSort o1, UebungenSort o2) {
    return Integer.compare(o1.id, o2.id);
  }
};
// nur byName
private static final Comparator<UebungenSort> byName = new Comparator<UebungenSort>() {
  public int compare(UebungenSort o1, UebungenSort o2) {
    return o1.name.compareToIgnoreCase(o2.name);
  }
};
// by Id und dann by Name
private static final Comparator<UebungenSort> byIdAndByName = comparingBy(byId, byName);
 
T

tollewurst

Mitglied
Okay danke, muss ich morgen mal ausprobieren, aber ich habe das Gefühl ich muss noch mal was umstellen, da ich irgendwo einen Denkfehler habe.
Weil eigentlich ist es so. z.b.
0-50 bilden eine Gruppe, die sollen nach Name sortiert werden
50-100 nächste Gruppe nach Name sortieren
usw.
Also
0 A
1 Aa
50 A
51 Aa
usw. soll raus kommen
 
H

httpdigest

Top Contributor
Das ist ja jetzt nun etwas völlig anderes. Das wäre auch nicht das gewesen, was du mit dem Java 8 Comparator.thenComparing() erreicht hättest...
Vielleicht überlegst du erstmal, was genau du willst. :)
 
MoxxiManagarm

MoxxiManagarm

Top Contributor
0-50 bilden eine Gruppe, die sollen nach Name sortiert werden
50-100 nächste Gruppe nach Name sortieren

Heißt das, das wäre auch eine korrekte Sortierung?

Code:
1 A
0 B
50 A
51 B

Falls ja, sei hier das Beispiel von @httpdigest erweitert:

Java:
// Die neue Methode von oben
public static <T> Comparator<T> comparingBy(final Comparator<T>... comparators) {
  return new Comparator<T>() {
    public int compare(T o1, T o2) {
      for (int i = 0, r = 0; i < comparators.length; i++)
        if ((r = comparators[i].compare(o1, o2)) != 0)
          return r;
      return 0;
    }
  };
}
// nur byId
private static final Comparator<UebungenSort> byId = new Comparator<UebungenSort>() {
  public int compare(UebungenSort o1, UebungenSort o2) {
    return Integer.compare(o1.id, o2.id);
  }
};
// nur byIdGroup
private static final Comparator<UebungenSort> byIdGroup = new Comparator<UebungenSort>() {
  public int compare(UebungenSort o1, UebungenSort o2) {
    return Integer.compare(o1.id % 50, o2.id % 50);
  }
};
// nur byName
private static final Comparator<UebungenSort> byName = new Comparator<UebungenSort>() {
  public int compare(UebungenSort o1, UebungenSort o2) {
    return o1.name.compareToIgnoreCase(o2.name);
  }
};
// by IdGroup und dann by Name
private static final Comparator<UebungenSort> byIdGroupAndByName = comparingBy(byIdGroup, byName);
 
Zuletzt bearbeitet:
T

tollewurst

Mitglied
Hallo, dass es sowas

public static <T> Comparator<T> comparingBy(final Comparator<T>... comparators) {

gibt wusste ich bisher nicht. Musste aber in meine class noch eine fakevariable einbauen und dann die ids/50, dann geht es und es kommt sowas raus
0 A
0 Aa
0 Ab
0 B
...
1 A
1 Aa
1 Ab
1 B
...

kann ich nur sagen, danke und wieder was dazu gelernt :)
 
T

tollewurst

Mitglied
Da fällt mir gerade ein, da ich das mit dem " ... " noch nie gesehen habe, wo kann man das nachlesen ?
Hat mal einer einen link ?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Android Studio - ArrayList - Selected Item ermitteln Android & Cross-Platform Mobile Apps 13
F Android ArrayList nicht funktional in Android!? Android & Cross-Platform Mobile Apps 6
W App Abo Android Android & Cross-Platform Mobile Apps 10
OSchriever Android Android MediaPlayer bei Anruf stoppen/pausieren Android & Cross-Platform Mobile Apps 2
OSchriever Auf onClick-Listener reagieren und Parameter übergeben (Android Studio) Android & Cross-Platform Mobile Apps 4
W removeNetwork Android App mit Spendenaktion fürs Tierheim! Android & Cross-Platform Mobile Apps 1
T Android R.string.test+i Problem Android & Cross-Platform Mobile Apps 2
P undefinierbarer Fehler Android Android & Cross-Platform Mobile Apps 8
W Variable überschreiben (Android Studio) Android & Cross-Platform Mobile Apps 2
jmar83 Android Selbst entwickelter SMTP-Client läuft auf PC, nicht aber auf Android Android & Cross-Platform Mobile Apps 9
jmar83 Android Warum muss man bei Android Studio immer 2x auf "Run" klicken damit die App auf dem Gerät startet Android & Cross-Platform Mobile Apps 8
jmar83 Android Wo das 'android.useAndroidX' property hinzufügen? Android & Cross-Platform Mobile Apps 8
jmar83 Android In einem Android-“Spinner”-Element GLEICHZEITIG Bild (links) UND Text (rechts) anzeigen Android & Cross-Platform Mobile Apps 0
P Login und Registrierung Android Anzeige Android & Cross-Platform Mobile Apps 7
S Von JavaFx zu Android Android & Cross-Platform Mobile Apps 12
K Android to Pi | Websocket Problem Android & Cross-Platform Mobile Apps 3
jmar83 Wie fügt man bei Android Studio .jar-Libraries zu einem Android-Java-Projekt hinzu? Android & Cross-Platform Mobile Apps 33
M Komponenten positionieren in Android Studio 3.6.3 Android & Cross-Platform Mobile Apps 1
M Android Studio - Property-Fenster einblenden Android & Cross-Platform Mobile Apps 1
M Android Studio - App auf dem Smartphone testen Android & Cross-Platform Mobile Apps 7
M Barrierefreie Appentwicklung für Android - Suche Codebeispiele Android & Cross-Platform Mobile Apps 8
M Android Studio - Configuration fehlt Android & Cross-Platform Mobile Apps 15
M Wo kann ich das Android SDK herunterladen / wie kann ich es installieren Android & Cross-Platform Mobile Apps 3
M Unsupported class file major version 57 - Fehlermeldung bei Android Studio Android & Cross-Platform Mobile Apps 27
jmar83 Android Studio (SDK) ANDROID_SDK_ROOT-Variable? Android & Cross-Platform Mobile Apps 5
O Web API in Android (JAVA) einbinden Android & Cross-Platform Mobile Apps 3
J Android Studio macht seltsame Sachen Android & Cross-Platform Mobile Apps 2
J Android 9.1 aber android Studio findet API22 Android & Cross-Platform Mobile Apps 0
Dimax Web-Seite in native app convertieren mit Android Studio Android & Cross-Platform Mobile Apps 8
A Android Studio: while-Schleife beginnt nicht Android & Cross-Platform Mobile Apps 5
lolcore android studio: fehler bei laden des emulators Android & Cross-Platform Mobile Apps 10
J Android App - Browser öffnen und Text eingeben/Button click auslösen Android & Cross-Platform Mobile Apps 10
A Android-Studio: 2. Layout nach kurzer Zeit aufzeigen Android & Cross-Platform Mobile Apps 2
A jpg wird im Android Studio nicht akzeptiert Android & Cross-Platform Mobile Apps 3
T Android SDK-Manager startet nicht in Eclipse Android & Cross-Platform Mobile Apps 5
T Bringen mir die Java-Basics irgendetwas für die Android-Programmierung Android & Cross-Platform Mobile Apps 4
J Was soll das bedeuten ? does not require android.permission.BIND_JOB_SERVICE permission Android & Cross-Platform Mobile Apps 7
A Android Studio: ImageView verpixelt Android & Cross-Platform Mobile Apps 2
J intend Service im Android Studio Android & Cross-Platform Mobile Apps 4
L Android Android Development eventuell mit Flutter Android & Cross-Platform Mobile Apps 1
S Android Layout - welchen Typ? Android & Cross-Platform Mobile Apps 3
T Fehler Android Studio: java.net.MalformedURLException: no protocol: http%3A%2F%2Fwww.mal ..... Android & Cross-Platform Mobile Apps 2
Arif Android Android Studio: Fehler beim Einbinden fremder Bibliothek? Android & Cross-Platform Mobile Apps 2
L Android Android Contacts DB auslesen Android & Cross-Platform Mobile Apps 1
A Android Studio - App mit Nearby Android & Cross-Platform Mobile Apps 1
L Android content URI Datei einlesen Android & Cross-Platform Mobile Apps 9
N Android Game Background Service Android & Cross-Platform Mobile Apps 11
Jackii Android Android Studio Error im Testlauf ohne zu programmieren Android & Cross-Platform Mobile Apps 9
B Android Probleme mit Android Studio Android & Cross-Platform Mobile Apps 6
Excess Android Service läuft nicht in Sandby weiter Android & Cross-Platform Mobile Apps 2
B Android Projekt für Android und IOS erstellen? Android & Cross-Platform Mobile Apps 5
J App funktioniert auf Android 5, auf 6 nicht Android & Cross-Platform Mobile Apps 2
J Android Snake Android & Cross-Platform Mobile Apps 15
J Android TaschenRechner Android & Cross-Platform Mobile Apps 22
I Das Problem mit der Tastatur... android:windowSoftInputMode="adjustPan" Android & Cross-Platform Mobile Apps 1
E Wie erhalte ich Zugriff auf das Microfon? (Android Studio) Android & Cross-Platform Mobile Apps 9
C Android Programmierung speziell oder einfach Java Buch kaufen? Android & Cross-Platform Mobile Apps 3
B Android Kein Zugriff auf Telefonspeicher (Android 6) Android & Cross-Platform Mobile Apps 1
T Android Equalizer für Android Android & Cross-Platform Mobile Apps 3
L Android Android Studio - Exportierte APK funktioniert nicht Android & Cross-Platform Mobile Apps 6
L Android Methode funktioniert nicht unter Android Android & Cross-Platform Mobile Apps 3
A Beginnen mit Serverkommunikatsion in Android Studio Android & Cross-Platform Mobile Apps 6
E Android Studio Android & Cross-Platform Mobile Apps 15
L Android Android Studio Setup killt Explorer Android & Cross-Platform Mobile Apps 3
K Android Videos rendern Android & Cross-Platform Mobile Apps 1
J Variable in strings.xml (Android Studio) Android & Cross-Platform Mobile Apps 0
B Android Android Studio lässt PC abstürzen Android & Cross-Platform Mobile Apps 3
B Android App Fehler Android & Cross-Platform Mobile Apps 21
J android Spinner funktioniert nicht Android & Cross-Platform Mobile Apps 14
G Android Push Notification Android & Cross-Platform Mobile Apps 2
Light Lux Fehlermeldung unter Android Studio Android & Cross-Platform Mobile Apps 1
D Android Android Apps direkt vom Handy aus programmieren? Android & Cross-Platform Mobile Apps 2
L Android Android Kalendar Tag Ansicht Android & Cross-Platform Mobile Apps 1
J Android Java Packet in Android Java ide hinzufügen. Android & Cross-Platform Mobile Apps 3
L Android Texterkennung für Android? Android & Cross-Platform Mobile Apps 1
L Android Chart API für Android Android & Cross-Platform Mobile Apps 0
L Android SQLite mit HSQLDB über Android synchronisieren Android & Cross-Platform Mobile Apps 13
B Android Text von Android zu PC senden? Android & Cross-Platform Mobile Apps 5
ATZENPOWER Android Probleme mit mobilen Daten via lte Android & Cross-Platform Mobile Apps 10
A Android Android Studio Emulator Problem Android & Cross-Platform Mobile Apps 1
J standardmässige Persistenz bei Android Android & Cross-Platform Mobile Apps 2
Dechasa Android Android - Canvas NullpointException Android & Cross-Platform Mobile Apps 2
S Android Studio Bluetooth App Problem Android & Cross-Platform Mobile Apps 6
L Android Android exportierte XML einlesen Android & Cross-Platform Mobile Apps 2
T Android Programm zu Android-App Android & Cross-Platform Mobile Apps 4
Florum Android FTP Upload über Android Android & Cross-Platform Mobile Apps 15
P Android Android-App Crash - Unable to start activity ComponentInfo Android & Cross-Platform Mobile Apps 2
S Android Unfortunately, the process com.android.phone has stopped Android & Cross-Platform Mobile Apps 0
Maresuke Android Android Studio & Bitbucket Android & Cross-Platform Mobile Apps 0
S Software-Tastatur des Android-Studio-Emulators öffnen? Android & Cross-Platform Mobile Apps 0
S Android Studio Emulator falsch eingestellt? Android & Cross-Platform Mobile Apps 1
S Android Problem mit Android Virtual Device erstellung. Android & Cross-Platform Mobile Apps 2
N Blackscreen bei while-Schleife? (Android-Studio) Android & Cross-Platform Mobile Apps 2
Maresuke Android Android ListView Textfarbe und Texthintergrund ändern? Android & Cross-Platform Mobile Apps 5
V Android Android Programmieren-Objekt-Konstruktor in Klammern Android & Cross-Platform Mobile Apps 2
J (Android) Bild(er) anzeigen lassen Android & Cross-Platform Mobile Apps 0
V Android Fehlermeldung beim Öffnen von Eclipse nach Installation der Android Erweiterung Android & Cross-Platform Mobile Apps 4
P Android App - Java Android & Cross-Platform Mobile Apps 1
L Android Android Addressbuch Kontakte und Bilder auslesen? Android & Cross-Platform Mobile Apps 1
R Android Programmierung Android & Cross-Platform Mobile Apps 3

Ähnliche Java Themen

Anzeige

Neue Themen


Oben