# Zeilen und Spalten sortieren



## leany (27. Dez 2011)

Ich komm nicht weiter mit einer Aufgabe zum Thema 'mehrdimensionales Array sortieren':

Ich soll Kundendaten verwalten. Dazu habe ich folgendes Programm geschrieben:


```
import inout.Console;
 
    public class Kundenverwaltung 
    {
        public static void main(String[] args) 
        {
            int pos, posMin, spalte, steigung, a=0, b=0;
            String min,merke;
            final String[][] Kundendaten = 
            {{"25", "Notter", "Kurt", "3000 Bern"},
            {"3", "Meyer", "Peter", "3280 Murten"},
            {"58", "Henzig", "Barbara", "3822 Interlaken"},
            {"22", "Vogel", "Tina", "3825 Muerren"}
        };
        final String[][] Ergebnisfeld = new String[4][4];
      System.out.println("Soll aufsteigend oder absteigend sortiert werden? \n(aufsteigend = 0, absteigend = 1)");
      steigung = Console.readInt();
      
        {
            System.out.println("wie soll sortiert werden \n(Kundennummer = 0, Nachname = 1, Vorname = 2, Adresse = 3))");
            spalte = Console.readInt();
            if(steigung == 0 || steigung == 1)
            {
                if (steigung==0)
                {
                    for(int zeile = 0;zeile < Kundendaten.length; zeile++)
                    {
                        posMin = zeile; min = Kundendaten[zeile][spalte];
                        for(pos=zeile+1; pos<Kundendaten.length; pos++)
                        if(Kundendaten[pos][spalte].compareTo(min) < 0)
                        {
                            min= Kundendaten[pos][spalte];
                            posMin = pos;
                        }
                        merke = Kundendaten[zeile][spalte];
                        Kundendaten[zeile][spalte]= Kundendaten[posMin][spalte];
                        Kundendaten[posMin][spalte] = merke;
                        Ergebnisfeld[a][b]= Kundendaten[zeile][spalte];
                        a++;
                        if(zeile == 3)
                        {b++;}
                    }         
                }
                if (steigung==1)
                {
                    for(int zeile = 0; zeile < Kundendaten.length; zeile++)
                    {
                        posMin = zeile; min = Kundendaten[zeile][spalte];
                        for(pos=zeile+1; pos<Kundendaten.length; pos++)
                        if(Kundendaten[pos][spalte].compareTo(min) > 0)
                        {
                            min= Kundendaten[pos][spalte];
                            posMin = pos;
                        }
                        merke = Kundendaten[zeile][spalte];
                        Kundendaten[zeile][spalte]= Kundendaten[posMin][spalte];
                        Kundendaten[posMin][spalte] = merke;  
                        Ergebnisfeld[a][b]= Kundendaten[zeile][spalte];
                        a++;
                        if(zeile == 3)
                        {b++;}
                    } 
                }
            }
            else 
       System.out.println("Ungültige Eingabe ! aufsteigend = 0 oder absteigend = 1 EINGEBEN");
       a=0;
    }
       for(int i=0; i<=3; i++)       
        {
             System.out.println();
            for(int j=0; j<=3; j++)
                {
                    System.out.print(Ergebnisfeld[i][j]+"\t\t");
                }
        
    }
}
   }
```

Das ganze funktioniert nur eindimensional, aber leider nicht über die ganze 4x4-Matrix. Das heisst, es wird nur sortiert, nach Nummer oder Name oder Vorname oder Adresse. eigentlich bräuchte ich aber Nummer und Name und Vorname und Adresse. Könnt Ihr mir sagen, wie ich alle Spalten ausgeben kann.
A+
Leany


----------



## DummerBauer (27. Dez 2011)

Da musst du selber eine Klasse schreiben die das macht.
sonst schau mal hier http://www.java-forum.org/java-basics-anfaenger-themen/128840-mehrdimensionale-arrays-sortieren.html


----------



## der-escrimador (28. Dez 2011)

Vielleicht ist es aber auch alles etwas uebersichtlicher wenn du mit Objecten arbeitest
Es ist moeglich unterschiedliche Comparator zu implementieren.

Vielleicht hilft dir das weiter


```
public class Test {
	public static void main(String[] args) {

		ArrayList<Person> list = new ArrayList<Person>();
		list.add(new Person("Chuck", 30));
		list.add(new Person("Bruce", 31));
		list.add(new Person("Jet", 25));
		System.out.println("sort by name");
		Collections.sort(list, new NameComparator());
		printList(list);
		System.out.println("sort by age");
		Collections.sort(list, new AgeComparator());
		printList(list);
	}
	
	static void  printList(ArrayList<Person> list){
		for (Person person : list) {
			System.out.println(person);
		}
	}
}

class NameComparator implements Comparator<Person> {
	@Override
	public int compare(Person o1, Person o2) {
		return o1.name.compareTo(o2.name);
	}
}

class AgeComparator implements Comparator<Person> {
	@Override
	public int compare(Person o1, Person o2) {
		return o1.age.compareTo(o2.age);
	}
}

class Person {
	String name;
	Integer age;

	public Person(String name, Integer age) {
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return name+"\t"+age;
	}
	

}
```


----------



## tuttle64 (28. Dez 2011)

Um absteigend zu sortieren kann man die Methode reverseOrder() der Klasse Collections verwenden, egal ob es sich um ein Array oder eine ArrayList handelt. Ist p ein Array von Personen und es gibt eine Klasse AgeComparator welche aufsteigend nach Alter sortiert, dann kann mit

Arrays.sort(p, Collections.reverseOrder(new AgeComparator()));

absteigend nach Alter sortiert werden. Damit das funktioniert, müssen die Objekte im Array das Interface Comparable implementieren oder man übergibt der Methode reverseOrder einen Comparator.

Im übrigen ist der Grund, weshalb nicht alle Attribute ausgegeben werden, ein Bug im Code.


----------



## leany (28. Dez 2011)

tuttle64 hat gesagt.:


> Um absteigend zu sortieren kann man die Methode reverseOrder() der Klasse Collections verwenden, egal ob es sich um ein Array oder eine ArrayList handelt. Ist p ein Array von Personen und es gibt eine Klasse AgeComparator welche aufsteigend nach Alter sortiert, dann kann mit
> 
> Arrays.sort(p, Collections.reverseOrder(new AgeComparator()));
> 
> ...



Kannst Du mir sagen, wo der Bug ist. Da es eine Aufgabe ist, sollte ich von diesem Code nicht all zu sehr abweichen.

aufsteigend und absteigend sortieren tut's ja - nur nicht über alle 4 Spalten...

Danke
Leany


----------



## tuttle64 (28. Dez 2011)

leany hat gesagt.:


> Kannst Du mir sagen, wo der Bug ist. Da es eine Aufgabe ist, sollte ich von diesem Code nicht all zu sehr abweichen.
> 
> aufsteigend und absteigend sortieren tut's ja - nur nicht über alle 4 Spalten...
> 
> ...




Mit der Zuweisung

Ergebnisfeld[a]*= Kundendaten[zeile][spalte];

in der for-Schleife wird immer nur die Spalte 0 resp. das ausgewählte Sortierungsattribut zugewiesen und so erhalten die Spalten 1 bis 3 jeweils den Default-Wert null. Die Zeile 

 System.out.print(Ergebnisfeld[j]+"\t\t");

produziert folgendes:




			Tina		null		null		null		
Peter		null		null		null		
Kurt		null		null		null		
Barbara		null		null		null
		
Zum Vergrößern anklicken....

*


----------



## leany (1. Jan 2012)

tuttle64 hat gesagt.:


> Mit der Zuweisung
> 
> Ergebnisfeld[a]*= Kundendaten[zeile][spalte];
> 
> ...


*

Soweit bin ich schon gekommen. Stehe aber auf dem Schlauch und komme mit der Lösung nicht weiter. Hab mich nun entschlossen, nochmals ein paar Kapitel weiter vorne anzufangen, vielleicht kapier ich's dann?!?
A+ und danke schon mal
Leany*


----------



## PHens (12. Dez 2013)

Guten Abend,

ich stehe nun mit gleicher Aufgabenstellung vor dem Selben Problem. 
In das Ergebnisfeld wird nur die ausgewählte Spalte überschrieben, die weiteren Einträge der Zeile jedoch nicht. 

Ich finde den Fehler selbst nicht, kann denn mal jemand drüberschauen ? Falls es jemand am Beispiel von leany machen könnte, würde ich es eventuell schon verstehen :rtfm:


----------



## Tiding (13. Dez 2013)

Aber:


```
if(zeile == 3)
                    {b++;}
```

zeile ist angenommen 3 also wird b eins dazuaddiert, aber:


```
for(int zeile = 0;zeile < Kundendaten.length; zeile++)
```

zeile ist immer noch 3 also springt er aus der Schleife.
Folge:
er geht zwar in die zweite Spalte des neuen Arrays (b++) aber macht damit nix.


----------



## Tiding (13. Dez 2013)

am einfachsten wäre es mit Objekten, aber wenn du den Code nicht derart verändern willst, musst du schauen, wie du in der for-Schleife abhängig von dem Zeilenindex, der dem min zugeordnet ist, dem neuen Array die dazugehörigen verbliebenen Spalten zuweist.


----------



## PHens (16. Dez 2013)

Also sieht das so aus, dass ich dann für das b eine eigene for Schleife bauen sollte ? Die dann innerhalb der Zeile die Spalten durchzählt ? 
Weil so wie der Code jetzt ist, also was du schon erklärt hast, schreibt der immer wieder den Inhalt der ersten Spalte in die erste Spalte des Ergebnisfeldes rein, und nachdem der also alle Ergebnisse reingeschrieben hat, (if(zeile == 3) b++) springt der erst in Spalte 2 vom Ergebnisfeld. Und an der Stelle ist aber die Schleife für die Zeilen schob bei 3, also beendet.
Habe ich den Fehler richtig verstanden ?  

Falls ja, dann hat mir das denke ich schon sehr geholfen. Ich werd nachher mal weiter daran basteln, und komme hoffentlich zu einer lösung. :rtfm::toll:

Mit freundlichem Gruß,
PHens


----------



## Tiding (19. Dez 2013)

Er beschreibt nur die erste Spalte mit den sortierten Strings.
Die restlichen werden überhaupt garnicht erst beschrieben! Am einfachsten wäre es, jedenfalls anschaulich, während du z.B. (sortieren nach Nachnamen) während du "Henzig" in das neue Array an stelle [0,0] schreibst, auch die restlichen Elemente dieser Zeile (in dem Fall Zeile zwei des alten Arrays) in die Zeile 0 des neuen schreibst, weil man ja hier den Zeilenindex angegeben hat. Ne For-Schleife bietet sich hier aber evtl. nicht gerade an, da es ja nur noch weitere 3 Elemente sind könnte man es so machen wie es schon vorgegeben ist, oder einfach alle Zuordnungen in einer Schleife abhandeln.


----------

