# 2D Array sortieren



## beachmeat (13. Sep 2005)

Hallo zusammen, 

erstmal möchte ich als Neuling im Forum "Hallo" sagen, ich fange grade an etwas tiefer in Java vorzudringen, und stehe grade vor dem Zaun der mich vor dem Wissen abhalten will, wie man ein 2D Array sortieren kann...


Wenn ich ein Array habe das wie folgt aufgebaut ist:



```
int[][] silh;
silh  = new int[2][2];

silh[0][0] = 1;
silh[0][1] = 10;

silh[1][0] = -1;
silh[1][1] = 20;
```


nun möchte ich dieses Array möglichst performant nach dem Wert im 2ten Index sortieren (also 10 bzw. 20) - wie ist das möglich? Ich nehme mal an das das schon mal jemand vor mir gelöst hat 

Vielen Dank für eure Hilfe!
Manuel


----------



## Beni (13. Sep 2005)

Such nach "Arrays.sort" und "Comparator", das reicht schon um das ganze zu sortieren.

Link


----------



## beachmeat (13. Sep 2005)

Hallo Beni und danke für deine Antwort.

Ich sehe bei Arrays.sort allerdings nicht wo ich da ein 2D array angeben kann, und bestimmen welchen Index der 2ten dimension er zum vergleichen nehmen soll.
Kannst Du mir bitte ein kleines Beispiel machen?


----------



## byte (13. Sep 2005)

Comparator ist unnötig bei nem int array. versuchs mal mit


```
Arrays.sort(array[0]);
Arrays.sort(array[1]);
```


----------



## beachmeat (13. Sep 2005)

Vielleicht habe ich mich nicht gut ausgedrückt...

Dies Array:

```
silh[0][0] = 1; 
silh[0][1] = 0; 

silh[1][0] = 2; 
silh[1][1] = 1;

silh[1][0] = 3; 
silh[1][1] = -10;
```

soll so sortiert werden, das der 2te Index in der 2ten Dimension benutzt wird....also das dann folgendes rauskommt:


```
silh[1][0] = 3; 
silh[1][1] = -10; // <-- die stelle wird verglichen, deshalb dies am Anfang

silh[0][0] = 1; 
silh[0][1] = 0; 

silh[1][0] = 2; 
silh[1][1] = 1;
```

Ich denke also das ich eine Methode bräuchte, bei welcher man bestimmen kann welcher Index verwendet wird, oder?


----------



## Beni (13. Sep 2005)

Ein int[][] ist kein 2D-Array! Es ist ein Array von int[]'s. Da aber ein int[] nur ein Object ist, funktioniert "sort( Object[] x )".

Mit Java 1.5:

```
import java.util.Arrays;
import java.util.Comparator;

public class Test {
    public static void main( String[] args ) {
        int[][] test = new int[][]{
                {1, 4},
                {2, -8},
                {3, 5}
        };
        
        System.out.println( "Nicht sortiert:" );
        print( test );
        
        Arrays.sort( test, new Comparator<int[]>(){
            public int compare( int[] o1, int[] o2 ) {
                return o1[1] - o2[1];
            }
        });
        
        System.out.println( "Sortiert:" );
        print( test );
    }
    
    public static void print( int[][] test ){
        for( int i = 0; i < test.length; i++ )
            System.out.println( Arrays.toString( test[i] ));
    }
}
```


----------



## beachmeat (13. Sep 2005)

Danke nochmals für die Antwort, ich bekomme allerdings diesen Compiler-Error in Eclipse: 

java.lang.Error: Unresolved compilation problems: 
	The type Comparator is not generic; it cannot be parameterized with arguments <int[]>
	Syntax error, parameterized types are only available if source level is 5.0


----------



## Beni (13. Sep 2005)

Schalt unter "Window > Preferences > Java > Compiler" alles auf 5.0 um. Unter Umständen musst du dir auch eine neuere Version der JRE/von Eclipse besorgen :wink:

(Ansonsten wäre eine Variante zu überlegen, wie man das halt ohne Generics machen würde. Es ist nicht allzuschwer...)


----------



## beachmeat (13. Sep 2005)

Ok, mit ein bißchen Hirn auf meiner Seite hätte ich da ja auch selbst kapieren können  
Es klappt jetzt! Vielen Dank!

Wegen das ganze "ohne Generics" : Die Sache ist, da ich eigentlich nicht in Eclipse arbeite, sondern in *hust* processing....da ist das nicht ganz unproblematisch auf jre 5 zu arbeiten afaik...deshalb wäre ich ausserordentlich an einer Lösung interessiert die nichts auf der 5er Version benutzt falls das möglich ist...?


----------



## byte (13. Sep 2005)

der comparator ohne generics sieht quasi genauso aus. der unterschied ist, dass die compareTo() dann als parameter zwei objects benötigt. du musst dann in der compareTo() auf die richtigen objekte casten (in deinem fall int[]).


----------



## beachmeat (13. Sep 2005)

Ich weiss es hört sich unglaublich an, aber ich weiss nicht wie ich das umsetzen soll...wo ist denn die compareTo?

Meinst du so?


```
Arrays.sort( test,  public int compare( int[] o1, int[] o2 ) { 
 return o1[1] - o2[1]; 
 });
```
[/code]


----------



## byte (13. Sep 2005)

nein. so etwa:


```
Arrays.sort( test, new Comparator(){
            public int compare( Object o1, Object o2 ) {
                int[] a1 = (int[]) o1;
                int[] a2 = (int[]) o2;
                return a1[1] - a2[1];
            }
        });
```


----------



## beachmeat (13. Sep 2005)

Genial.  :toll: 

Funktioniert, sogar im beschränkten Processing.
Vielen Vielen Dank, ihr habt mir wirklich sehr geholfen und meine Motivation am Leben erhalten  

Eine Frage dazu noch: Wäre es möglich das ich anstatt Object gleich int übergebe und mir so das konvertieren sparen? Oder geht genau das nicht ohne <int[]> ?

Danke!
Manuel


----------



## beachmeat (13. Sep 2005)

Ah und nochwas, wie kann ich denn ein solch ein Array clonen?


----------



## Beni (13. Sep 2005)

> Oder geht genau das nicht ohne <int[]>


Jop, genau das geht nicht (es sei denn, du schreibst dir einen eigene Sortieralgorithmus...). Deshalb wurde die Generics auch eingeführt :wink:

Ich weiss gerade nicht, ob "einArray.clone()" funktioniert, aber schreib dir doch einfach eine kleine Methode. Mit "System.arraycopy" kann man ziemlich schnell ganze Arrays umkopieren.

Müsste ungefähr so funktionieren:

```
public int[][] clone( int[][] original ){
  int[][] clone = new int[original.length][];
  for( int i = 0; i < clone.length; i++ ){
    clone[i] = new int[ original[i].length ];
     System.arraycopy( original[i], 0, clone[i], 0, clone[i].length );
  }
}
```


----------



## Bleiglanz (13. Sep 2005)

einfach myArray.clone() oder mit java.lang.System#arraycopy in ein neues kopieren


----------

