ArrayList<ArrayList<Integer>> sortieren

sheddy

Mitglied
Hallo,

ich würde gerne eine Liste A von Listen von Integer sortieren lassen. Die untergeordneten Listen sind sortiert. Jetzt möchte ich erreichen, dass die einzelnen Listen in der obergeordneten Liste sortiert sind.

1. nach der Initialisierung:

[[8, 2, 5, 9, 1, 3, 7, 6, 10, 4], [10, 10, 7, 1, 2, 5, 10, 3, 6, 4], [2, 8, 7, 1, 10, 5, 10, 3, 6, 4]]

2. nach der Sortierung der einzelnen Listen und in umgekehrter Reihenfolge

[[10, 9, 8, 7, 6, 5, 4, 3, 2, 1], [10, 10, 10, 7, 6, 5, 4, 3, 2, 1], [10, 10, 8, 7, 6, 5, 4, 3, 2, 1]]

3. fehlt: Folgendes soll erscheinen:

[[10, 10, 10, 7, 6, 5, 4, 3, 2, 1], [10, 10, 8, 7, 6, 5, 4, 3, 2, 1], [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]]

Das heißt, die Listen in der Liste A sollen geordnet werden. Die erste Liste soll die Liste sein, die höchsten Werte hat. Ist der erste Wert gleich, so vergleiche mit dem zweiten Wert und sortiere. Sollte der wieder gleich sein, setze fort.

Ich bräuchte einmal Hilfe, wie ich das umsetzen kann.

Mein Versuch sieht wie folgt aus:

Java:
package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Sortierung {
	private ArrayList<ArrayList<Integer>> list;
	
	
	
	private class ListComparator implements Comparator<ArrayList<Integer>>{

		@Override
		public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
			// TODO Auto-generated method stub
			return o1.get(0).compareTo(o2.get(0));
		}
		
	}
	
	
	public Sortierung(){
		list = new ArrayList<ArrayList<Integer>>();
		initLists();
		print();
		sortList();
		System.out.println("");
		print();
		System.out.println("");
		sortMainList();
		print();
	}
	
	private void sortMainList(){
		Collections.sort(list, new ListComparator());
	}
	
	private void sortList(){
		for(int i = 0; i<list.size(); i++){
			Collections.sort(list.get(i));
			Collections.reverse(list.get(i));
		}
	}
	
	private void print(){
		System.out.println(list);
//		for(int i = 0; i<list.size(); i++){
//			System.out.println(list.get(i));
//		}
	}
	
	private void initLists(){
		
		// erstes Liste
		ArrayList<Integer> subList = new ArrayList<Integer>();
		subList.add(8);
		subList.add(2);
		subList.add(5);
		subList.add(9);
		subList.add(1);
		subList.add(3);
		subList.add(7);
		subList.add(6);
		subList.add(10);
		subList.add(4);
		
		list.add(subList);
		
		
		
		// zweite Liste
		subList = new ArrayList<Integer>();
		subList.add(10);
		subList.add(10);
		subList.add(7);
		subList.add(1);
		subList.add(2);
		subList.add(5);
		subList.add(10);		
		subList.add(3);		
		subList.add(6);		
		subList.add(4);
		
		list.add(subList);
		
		// dritte Liste
		subList = new ArrayList<Integer>();
		subList.add(2);
		subList.add(8);
		subList.add(7);
		subList.add(1);
		subList.add(10);
		subList.add(5);
		subList.add(10);		
		subList.add(3);		
		subList.add(6);		
		subList.add(4);
		
		
		list.add(subList);
		
	}
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Sortierung();		
	}

}

Vielen Dank für eure Hilfe im voraus.

Gruß
sdy
 
Du vergleichst jeweils nur das erste Listen-Element. Wenn diese gleich sind, dann vergleiche die zweiten ... usw
Zwischendurch solltest du natürlich prüfen, ob die Listen überhaupt noch ein nächstes Element besitzen.
Wenn bis zum letzten Listenelement alle Elemente gleich sind, dann gib im Comparator eine 0 zurück! Was geschehen soll, wenn die eine Liste mehr Elemente hat als die andere und bist zum letzten Element der kürzeren Liste beide Liste übereinstimmen, musst du dir selbst überlegen.
 
Hi,

genau, ich vergleiche gerade nur das erste Element, weil ich genau da hänge. Vielleicht habe ich das mit dem Comparator noch nicht ganz durchblickt bzw. das mit den Rückgaben.

Ich muss diesen Test (Vergleich Element für Element) doch oben in der privaten Klasse in der compare-Methode durchführen,oder?

Kannst du mir vielleicht ein Beispiel mit verschiedenen Rückgabewerten geben? An wen werden die Werte denn zurückgegeben. Ich glaube, das ist noch so ein Punkt, an dem ich hänge.
 
Alles klar. Gelöst. Noch einmal kurz in die Java Insel geguckt, was die Rückgabewerte für eine Bedeutung haben und dann liefs 😉

Hier meine Lösung:

Java:
private class ListComparator implements Comparator<ArrayList<Integer>>{

		@Override
		public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
			// TODO Auto-generated method stub
			int index = 0;
			
			
			if(o1.size() > o2.size()){
				index = o2.size();
			}else{
				index = o1.size();
			}
			
			for(int i = 0; i < index; i++){
				if(o1.get(i) == o2.get(i)){
					continue;
				}else{
					return o1.get(i).compareTo(o2.get(i));					
				}					
			}
			return 0;
		}
		
	}

Vielen Dank für den Tipp.

Gruß
Sdy
 

Zurück
Oben