sorteren 2-dimensionale array

Status
Niet open voor verdere reacties.

Bridelance

Gebruiker
Lid geworden
10 okt 2007
Berichten
30
Ik zit vast met het sorteren van een twee dimensionale array

in de rij 0 zitten bijvoorbeel 5 willekeurige waarden:
2 1 3 9 -1

in rij 1 zitten de oorspronkelijke positie's opgeslagen, dus:
0 1 2 3 4


nu wil ik gaan sorteren (van klein naar groot) op rij 0, en ondertussen moet rij 1 meeworden verwisseld. Uiteindelijk zou er dit op rij 0 en 1 moeten staan:
-1 1 2 3 9
4 1 0 2 3


(dus voor de duidelijkheid, de positie's moeten vasthangen aan de getallen van de eerste rij)



is er een methode om dit snel te doen (dus maar in enkele lijntjes??)
 
Het mooiste is denk ik om een data klasse te maken Met je twee waarden (noem deze bv Pair) .Je klasse moet dan ook de comparable interface implemtenteren.
Deze interface heeft maar een functie nml: compareTo(Object o).
en deze functie wordt gebruikt als je list gaat sorteren. Je moet hier "this" met "o" vergelijken en negatief getal terug geven als "this" kleiner is dan "o". Dus omdat je maar alleen op de eerste waarde wil sorteren zal deze functie iets zijn als:

return this.eersteWaarde - ((Pair) o).eersteWaarde;

Je kan nu een lijst aanmaken met
List<Pair> lijst = new ArrayList<Pair>().
met lijst.add(..) kan je "Pair" objecten toevoegen.

Voor het sorteren kan je gebruik maken van Collections.sort(lijst);

en je lijst is gesorteerd op de eerste waarde...
 
Nog een kleine aanvulling waarmee ik wellicht iets kan verduidelijken.
Het is dan dus wel de bedoeling dat je gebruikt maakt van een List (ArrayList bijvoorbeeld).
compareTo(Object o) verwacht wel een object als parameter, dus dit zal niet werken met de 2-dimentionale array als in myArray[][] .
Succes!
 
Hier is voorbeeld hoe het zou kunnen. (kan nog wel een stuk mooier want Pair kan je generiek maken en dan kan werkt het voor alle typen objecten)

Zoals je ziet kan het sorteren in 1 regel... De "truc" zit hem in de compareTo methode.

Code:
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        List<Pair> lijst = new ArrayList<Pair>();
       
        lijst.add(new Pair(3,1));
        lijst.add(new Pair(2,2));
        lijst.add(new Pair(1,3));
        
        for (Pair pair : lijst) {
            System.out.println(pair.a + ":" + pair.b);
        }
        
        Collections.sort(lijst);
        
        for (Pair pair : lijst) {
            System.out.println(pair.a + ":" + pair.b);
        }
    }

    public static class Pair implements Comparable {
        public int a;
        public int b;
        
        public int compareTo(Object o) {
           return this.a - ((Pair)o).a;
        }
        
        Pair(int a, int b) {
          this.a = a;
          this.b = b;
        } 
    }
}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan