ArrayList nach mehreren Spalten sortieren?

Status
Nicht offen für weitere Antworten.

schuetzejanett

Bekanntes Mitglied
Hallo,

gibt es eine Möglichkeit in einer Arraylist nur bestimmte Zeilen zu sortieren. Also nur die Zeilen 3-5 oder so. Oder gibt es vielleicht die Möglichkeit mehrere Spalten zum Sortieren anzugeben. Also erst nachname dann Vorname dann Wohnort usw.

Bin bis jetzt soweit das ich mir eine Klasse geschrieben habee die abhängig von der gewünschten Spalte die gesamt Liste sortiert. möchte aber eben nach mehreren Spalten sortieren. Deswegen meine Idee erst die gesamte tabelle nach einer Spalte dann alle gleichen nach der 2. Spalte usw. Weiß aber nicht wie ich das realisieren soll Hatte schon überlegt die gleichen jeweils in eine ArrayList und das dann weitersortieren und dann wieder die gleichen in eine ArrayList und weitersortieren usw. Allerdings bräucte die dafür 6 arraylisten und denke das das Speicherverschwendung ist.

Habt ihr eine idee wie ich das ganze realiesieren kann?

Hier meine bisheriege sortierKlasse

Code:
class ArraySort implements Comparator<PjOv>{
		
		public final static int LASTNAME	= 0;		
		public final static int FIRSTNAME	= 1;
		public final static int CONTPARTNER = 2;		
		public final static int INLAND 		= 3;
		public final static int ATTACH 		= 4;
	
		private int sortField;	

                                public ArraySort(int sortField) {
			this.sortField = sortField;
		}

		public int compare(PjOv pjOv1, PjOv pjOv2 )
		{
			int result = 0;
			switch (sortField) {
			case 0:
				result = pjOv1.getLastname().getName().compareTo(pjOv2.getLastname().getName());
				break;
			case 1:
				result = pjOv1.getFirstName().getName().compareTo(pjOv2.getFirstName().getName());
				break;
			case 2:
				result = pjOv1.getContractPartner().getName().compareTo(pjOv2.getContractPartner().getName());
				break;
			case 3:
				result = pjOv1.isAttach() && (!pjOv2.isAttach()) ? 1 : -1;		
				break;
			case 4: 
				result = pjOv1.isInland() && (!pjOv2.isInland()) ? 1 : -1;		
				break;
			default:
				break;			
			}
			return result;
		}		
	}
 
S

SlaterB

Gast
statt
case 0:
case 1:

usw. schreibe

case LASTNAME:
usw
wenn du schon so schöne Indexe hast,

-----

mehrere Sortierungen ist relativ leicht, übergib statt einem sortField mehrere (evtl. Array)

in compare fängst du mit dem ersten sortField an und machst mit den anderen weiter,
sofern vorhanden und compare result == 0 (Schleife!)
--------

nur Teile zu sortieren wird mit Collections.sort nicht klappen,
entweder eigener Algorithmus, oder:
Teilliste erstellen, sortieren, an richtige Position zurückschreiben
 

kleiner_held

Top Contributor
Das mit dem Sortieren nach mehreren Spalten hab ich ab und an ungefaehr so geloest:
Code:
	public abstract class FieldComparator<T> implements Comparator<T>
	{ 
	   boolean direction;
	   int[] fields;

	   public FieldComparator(boolean direction, int ...fields)
	   {
		   this.direction = direction;
		   this.fields = fields;
	   }
	   
	   public int compare(T o1, T o2)
	   {
		  int result = 0;
		  for (int i = 0; i < fields.length && result == 0; i++)
		  {
			  result = doCompare(fields[i], o1, o2);
		  }
		  return  result * (direction ? 1 : -1);
	   }
	   
	   protected abstract int doCompare(int field, T o1, T o2);
	}
 

schuetzejanett

Bekanntes Mitglied
Hallo,

danke für die schnelle Antwort.

Ich hänge jetzt aber bei der umsetzung deines Tips , mehrere spalten zu sortieren.

Da ich ja weiß wieviele spalten ich sortieren will muss ich ja kein Feld übergeben sondern kann das ja gleich in der Klasse festlegen.
ich verstehe was du damit meinst wenn result 0 weitersortieren in einer schleife bis keine spalten mehr sortiert werden müssen. Aber ich hänge ein bischen beim ablauf.

Wenn ich die arraylist sortieren will schreibe ich ja

Code:
Collections.sort(ListPjOv, new ArraySort());
//ohne Parameter weil spalten ja jetzt bekannt

das ruft doch die compareMethode in meiner klasse Arraysort auf.
Jetzt weiß ich allerdings nicht muss ich jetzt die compare methode mit einer schleife versehen. Oder eine andere methode die die compareMethode aufruft in der ich die spalten tück für stück angebe.
 
S

SlaterB

Gast
Code:
 public int compare(PjOv pjOv1, PjOv pjOv2 ) 
      { 

int result = 0;
while(<anzahlSortierungen && result == 0) {
  int sortField = aktuellesSortField // evtl Index nebeihochzähen

   // Rest wie bisher

}

}

siehe auch das Post kurz vor deinem!
 

schuetzejanett

Bekanntes Mitglied
hallo,

habe das versucht. Er bringt zar keinen fehler aber er sortiert auch nicht was ist falsch.
Code:
 public  class Sort implements Comparator<Model> 	   { 
					
			public final static int NACHNAME 	= 0;
			public final static int VORNAME 	= 1;		
			public final static int WOHNORT 	= 2;
			public final static int MAENNLICH    = 3; 
		 
		  
	      int[] fields = new int[4];      

	      public Sort() 
	      { 
	        for (int i =0 ; i <4 ;i++)
	        {
	        	
	        	fields[i] = i;
	        }
	      } 
	       
	      public int compare(Model o1, Model o2) 
	      { 
	        int result = 0; 
	        for (int i = 1; i < fields.length && result == 0; i++) 
	        { 
	           result = doCompare(fields[i], o1, o2); 
	        } 
	        return  result ;
	      } 
	       
	      private int doCompare(int field, Model o1, Model o2)
	      {
	    	  int result = 0;
	    	  switch (field) {
		
			case NACHNAME:
				result = o1.getNachname().compareTo(o1.getNachname());
				break;
			case VORNAME:
				result = o1.getVorname().compareTo(o1.getVorname());
				break;
			case WOHNORT:
				result = o1.getWohnort().compareTo(o1.getWohnort());
				break;
			case MAENNLICH:
				Boolean value3 = o1.isMaennlich();
				Boolean value4 = o1.isMaennlich();
				result = value3.compareTo(value4);				
			default:
				break;
			}	    	  
	    	  return result;
	   } 
}

[/code]
 
S

SlaterB

Gast
vom dumm rumstehen löst sich kein Programmierproblem der Welt,

erstelle dir eine Liste mit Testdaten,
und dann prüfe Schritt für Schritt, was genau der Comparator macht,
System.out.println-Lawine,
so dass am Ende rauskommt

'vergleiche Elemen A = ... mit Element B = ...'
'Result == 0, vergleiche Spalte x, Wert bei A = .., Wert = B ...'
'Endergebnis Result = ..' [oder wieder vorherigen Satz mit nächster Spalte]
usw.

lasse dir von deinem Programm millimetergenau ausgeben,
was es wann tut und warum welches Element kleiner als welches ist,

dann findest du jeden Fehler
 

schuetzejanett

Bekanntes Mitglied
Also Testdaten geschrieben und sortiert habe ich deswegen habe ich ja gesehen das er nix macht ok werde nochmal mit dem dabugger durchgehen und ein paar testausgaben machen
 

schuetzejanett

Bekanntes Mitglied
Ok habe den Fehler gefunden habe durch copy&Paste fehler immer ein objekt mit sich selbst verglichen.

Hier noch mal der entgültige und richtige code

Code:
public  class Sort implements Comparator<Model>       { 
                
         public final static int NACHNAME    = 0; 
         public final static int VORNAME    = 1;       
         public final static int WOHNORT    = 2; 
         public final static int MAENNLICH    = 3; 
       
        
         int[] fields = new int[4];      

         public Sort() 
         { 
           for (int i =0 ; i <4 ;i++) 
           { 
               
              fields[i] = i; 
           } 
         } 
           
         public int compare(Model o1, Model o2) 
         { 
           int result = 0; 
           for (int i = 1; i < fields.length && result == 0; i++) 
           { 
              result = doCompare(fields[i], o1, o2); 
           } 
           return  result ; 
         } 
           
         private int doCompare(int field, Model o1, Model o2) 
         { 
            int result = 0; 
            switch (field) { 
       
         case NACHNAME: 
            result = o1.getNachname().compareTo(o2.getNachname()); 
            break; 
         case VORNAME: 
            result = o1.getVorname().compareTo(o2.getVorname()); 
            break; 
         case WOHNORT: 
            result = o1.getWohnort().compareTo(o2.getWohnort()); 
            break; 
         case MAENNLICH: 
            Boolean value3 = o1.isMaennlich(); 
            Boolean value4 = o2.isMaennlich(); 
            result = value3.compareTo(value4);             
         default: 
            break; 
         }            
            return result; 
      } 
}

Danke nochmal für die schnellen Antworten
 

tfa

Top Contributor
Warum so kompliziert?
Der Sortieralgorithmus in Collections.sort() ist stabil. Also sortier Deine Liste erst nach dem
2. Kriterium und danach nach dem 1. Sortierkriterium und Du erhälst was Du willst.

tfa
 
S

SlaterB

Gast
ist ja auch nur der x-fache Aufwand
(was natürlich hier keine Rolle spielt, klar)
 

tfa

Top Contributor
SlaterB hat gesagt.:
ist ja auch nur der x-fache Aufwand
(was natürlich hier keine Rolle spielt, klar)

Kommt drauf an. Wenn Millionen Datensätze sortiert werden sollen, sicherlich.
Bei normalen Mengen ist mein Vorschlag vorzuziehen. Zwei Zeilen gegenüber 54,
die alle geschrieben, getestet und debuggt werden müssen...

tfa
 
S

SlaterB

Gast
Erbsenzähler,
und der Original-Comparator war ja auch schon 40 Zeilen lang,
und irgendwo muss dann immer noch die Schleife und das Array der Suchfelder her ;)
das gibt sich nix
 

tfa

Top Contributor
SlaterB hat gesagt.:
Erbsenzähler,
und der Original-Comparator war ja auch schon 40 Zeilen lang,
und irgendwo muss dann immer noch die Schleife und das Array der Suchfelder her ;)
das gibt sich nix

Was ich eigentlich sagen wollte: Warum selber was basteln wenn man doch ganz einfach
eine (eingebaute) Standardlösung nehmen kann? Geht schneller, ist sicherer und einfacher.

tfa
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Methoden Arraylist weiterverwenden nach methoden Aufruf Allgemeine Java-Themen 2
S arraylist nach n. Eintrag numerisch Sortiren Allgemeine Java-Themen 5
H LinkedList<LinkedList<String>> nach ArrayList<ArrayList<String>> ? Allgemeine Java-Themen 9
N ArrayList nach Reihenfolge prüfen Allgemeine Java-Themen 2
K ArrayList nach bestimmtem Muster sortieren Allgemeine Java-Themen 3
J ArrayList aus Point-Objekten nach dem x-Wert ordnen Allgemeine Java-Themen 2
C ArrayList nach Datum sortieren Allgemeine Java-Themen 7
U eigene Datenstruktur ArrayList<String> nach Object [][ Allgemeine Java-Themen 2
M ArrayList oder LinkedList Allgemeine Java-Themen 10
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
T Remove bei ArrayList funktioniert nicht Allgemeine Java-Themen 2
B Type mismatch: cannot convert from Graph.Edge to ArrayList<Graph.Edge> Allgemeine Java-Themen 21
R ArrayList Allgemeine Java-Themen 4
G jToggleButton in Array/ArrayList Allgemeine Java-Themen 12
J ArrayList, ganze Zeilen löschen oder überspringen Allgemeine Java-Themen 4
L ArrayList sortieren Allgemeine Java-Themen 2
C ArrayList Problem Allgemeine Java-Themen 3
O Datentypen Wie kann ich den Typ einer ArrayList abfragen ? Allgemeine Java-Themen 7
S Best Practices CopyConstrutor mit ArrayList Allgemeine Java-Themen 1
S ArrayList Design Allgemeine Java-Themen 4
S Array dynamisieren oder ArrayList verwenden? Allgemeine Java-Themen 17
L ArrayList mit String Arrays in ein Array umwandeln Allgemeine Java-Themen 1
H Elemente aus ArrayList in Array speichern Allgemeine Java-Themen 8
MiMa Person in einer Arraylist hinzugügen mit Prüfung ? Allgemeine Java-Themen 6
X Adjazenzliste ohne ArrayList Allgemeine Java-Themen 6
X Output von ArrayList Allgemeine Java-Themen 3
H Stream in ArrayList umwandeln Allgemeine Java-Themen 2
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
H Arraylist mit anderer ArrayList überschreiben Allgemeine Java-Themen 17
MiMa ArrayList sortieren?? Allgemeine Java-Themen 5
Curtis_MC Pointer mit ArrayList vergleichen Allgemeine Java-Themen 6
F ArrayList`s in Klassen mit Getter/Setter Allgemeine Java-Themen 8
W Array vs. ArrayList vs. HashMap Allgemeine Java-Themen 20
F Arraylist vollständig abspeichern und laden Allgemeine Java-Themen 1
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
D ArrayList Indexlänge ändern Allgemeine Java-Themen 2
E Elemente innerhalb einer ArrayList vergleichen Allgemeine Java-Themen 33
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
N Mehrdimensionale ArrayList mischen Allgemeine Java-Themen 10
S JTable - mehrere ausgewählte Rows in ArrayList Allgemeine Java-Themen 5
MiMa Date aus einer ArrayList<Date> holen ?? Allgemeine Java-Themen 5
MiMa ArrayList Rückgabewerte aus einer Funktion Allgemeine Java-Themen 15
L CSV File lesen, in ArrayList speichern und ausgeben Allgemeine Java-Themen 3
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
T Collections ArrayList Sortieren Allgemeine Java-Themen 4
P GUI: ArrayList anzeigen funktioniert nicht Allgemeine Java-Themen 5
H ArrayList: Leere Elemente finden? Allgemeine Java-Themen 2
GreenTeaYT Verständnisprobleme zur Arraylist Allgemeine Java-Themen 1
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
K ArrayList sortieren Allgemeine Java-Themen 16
A Bestimmte Inhalte aus ArrayList 1 in ArrayList 2 kopieren Allgemeine Java-Themen 6
S Mehrdimensionales ArrayList ins HashSet Allgemeine Java-Themen 10
C ArrayList Allgemeine Java-Themen 8
Streeber Probleme mit AWT-EventQueue: ArrayList Elemente hinzufügen Allgemeine Java-Themen 1
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
L Von ArrayList abgeleitete Klasse nur mit bestimmten Objekten füllen Allgemeine Java-Themen 1
K Array in ArrayList Allgemeine Java-Themen 16
Paul15 2D Arraylist in Jtable Allgemeine Java-Themen 1
Paul15 Arraylist 2D Allgemeine Java-Themen 8
B ArrayList in ein Objekt legen Allgemeine Java-Themen 1
Neumi5694 Datentypen ArrayList vs TreeMap Allgemeine Java-Themen 6
F ArrayList Allgemeine Java-Themen 11
X ArrayList will nicht so wie ich will. Hilfe Allgemeine Java-Themen 8
N ArrayList in eigenem Object nicht richtig serialisierbar Allgemeine Java-Themen 14
M ArrayList mit verschiedenen Datentypen in String konvertieren Allgemeine Java-Themen 10
Z Elemente einer ArrayList von rechts wegnehmen Allgemeine Java-Themen 5
W Arraylist Text Suchen und Datei löschen Allgemeine Java-Themen 5
R ArrayList und HashMap Allgemeine Java-Themen 7
T ArrayList zeilenumbruch entfernen Allgemeine Java-Themen 13
D Arraylist/For Schleife/Scanner Allgemeine Java-Themen 30
E ArrayList Anzahl der gleichen Elemente Allgemeine Java-Themen 4
Doopy ArrayList plötzlich leer Allgemeine Java-Themen 2
D Arraylist eigener Klasse an iReport übergeben Allgemeine Java-Themen 7
L ArrayList Inhaltstyp. Allgemeine Java-Themen 5
Z Klassen ArrayList selbst machen Allgemeine Java-Themen 5
J Arraylist speichern und laden? Allgemeine Java-Themen 5
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
D ArrayList index auf gültigkeit prüfen Allgemeine Java-Themen 12
M ArrayList<String> Frage Allgemeine Java-Themen 7
O ArrayList kaputt?! Allgemeine Java-Themen 5
M ArrayList<Foo> in ein Foo[] konvertieren? Allgemeine Java-Themen 8
Bananabert Abstract ArrayList Allgemeine Java-Themen 4
A Collections Array-Elemente in ArrayList kopieren ohne Schleife Allgemeine Java-Themen 7
O ArrayList - Serialisierungs-Problem Allgemeine Java-Themen 11
M JTable + ArrayList Allgemeine Java-Themen 3
M Datentypen ArrayList in Integer konvertieren Allgemeine Java-Themen 3
O Collections ListIterator gibt Inhalt von ArrayList nicht aus Allgemeine Java-Themen 3
Madlip Variablen 3 Werte aus ArrayList und weiter ... Allgemeine Java-Themen 4
O Problem beim Auslesen einer Arraylist von JComboBoxen Allgemeine Java-Themen 2
R Threads korrekte Synchronisation bei Vector und ArrayList Allgemeine Java-Themen 6
M Kovariante Rückgabewerte mit ArrayList Allgemeine Java-Themen 3
E NetBeans Vector durch ArrayList ersetzen Allgemeine Java-Themen 4
Maxim6394 Problem mit ArrayList Allgemeine Java-Themen 5
E Berechnung in Arraylist Allgemeine Java-Themen 10
E ArrayList mit unbekannter Größe Allgemeine Java-Themen 8
V Fork Join bei Arraylist Allgemeine Java-Themen 6
H Fehler in Arraylist Allgemeine Java-Themen 2
S Datensätze in eine ArrayList<Movie> speichern Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben