Avatar billede andreas Nybegynder
01. december 2006 - 15:17 Der er 10 kommentarer og
1 løsning

Sortering af multidimensional array

Hejsa,

Jeg har følgende multi array:

private static Object [][] rows = new Object [][] {
  {1,  "Fil01", 213123123.0},
  {2,  "Fil02", 123123123.0},
  {3,  "Fil03", 324234234.0},
  {4,  "Fil03", 234809238.0},
  {5,  "Fil04", 098374932.0},
  {20, "Fil05", 123987928.0},
  {7,  "Fil06", 979872398.0},
  {8,  "Fil07", 234920384.0},
  {9,  "Fil08", 324879283.0},
  {10, "Fil09", 347238923.0}
};

Nu vil jeg gerne lave en metode, som kan sortere efter den ene af kolonnerne. Den første kolonne er filens nummer, den næste er filens navn, og den sidste er en tid som er forbundet med filen.

Jeg vil gerne have, at hvis jeg vil sortere efter tid, så kommer f.eks. den fil med det største tal først i mit array osv.

Men hvordan gør jeg det, når det er et multi array?

Giver det mening?
Avatar billede arne_v Ekspert
01. december 2006 - 16:18 #1
jeg tror at du skal lave en comparator og bruge Arrays.sort
Avatar billede andreas Nybegynder
01. december 2006 - 16:50 #2
Det har jeg også selv fået mig læst frem til, men jeg kan ikke finde ud af hvordan Comparatoren skal laves.. Har siddet og bixet med det indtil nu
Avatar billede arne_v Ekspert
01. december 2006 - 19:15 #3
jeg har foelgende paa lager:

import java.util.*;

public class TwoDimSort {
  public static void main(String[] args) {
      int[][] a = { { 1, 4, 3, 2 }, { 0, 0, 4, 2 }, { 1, 3, 3, 8 } };
      for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            System.out.print(" " + a[i][j]);
        }
        System.out.println();
      }
      Arrays.sort(a, new Cmp());
      for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            System.out.print(" " + a[i][j]);
        }
        System.out.println();
      }
  }
}

class Cmp implements Comparator {
  public int compare(Object o1, Object o2) {
      int[] a1 = (int[]) o1;
      int[] a2 = (int[]) o2;
      int k = 0;
      for (;;) {
        if (k == a1.length && k == a2.length) {
            return 0;
        } else if (k == a1.length && k < a2.length) {
            return -1;
        } else if (k < a1.length && k == a2.length) {
            return 1;
        } else if (a1[k] == a2[k]) {
            k++;
        } else if (a1[k] < a2[k]) {
            return -1;
        } else if (a1[k] > a2[k]) {
            return 1;
        }
      }
  }
  public boolean equals(Object obj) {
      return false;
  }
}
Avatar billede arne_v Ekspert
01. december 2006 - 19:20 #4
jeg kan rette det til saa den matcher dit problem senere (om en 6-7 timer)
Avatar billede andreas Nybegynder
01. december 2006 - 20:38 #5
Når jeg lige leger med dit eksempel der, får jeg følgende i eclipse:

Type safety: Unchecked invocation sort(Object[], Comparator) of the generic method sort(T[],
Comparator<? super T>) of type Arrays


Ved din Array.sort linie...
Avatar billede arne_v Ekspert
02. december 2006 - 03:32 #6
eksempel:

package december;

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

public class TwoDimSort {
    private static Object[][] rows = new Object[][] {
            { 1, "Fil01", 213123123.0 },
            { 2, "Fil02", 123123123.0 },
            { 3, "Fil03", 324234234.0 },
            { 4, "Fil03", 234809238.0 },
            { 5, "Fil04", 098374932.0 },
            { 20, "Fil05", 123987928.0 },
            { 7, "Fil06", 979872398.0 },
            { 8, "Fil07", 234920384.0 },
            { 9, "Fil08", 324879283.0 },
            { 10, "Fil09", 347238923.0 } };
    public static void main(String[] args) {
        System.out.println("Before:");
        for (int i = 0; i < rows.length; i++) {
            for (int j = 0; j < rows[i].length; j++) {
                System.out.print(" " + rows[i][j]);
            }
            System.out.println();
        }
        Arrays.sort(rows, new Cmp());
        System.out.println("After:");
        for (int i = 0; i < rows.length; i++) {
            for (int j = 0; j < rows[i].length; j++) {
                System.out.print(" " + rows[i][j]);
            }
            System.out.println();
        }
    }
}

class Cmp implements Comparator<Object[]> {
    public int compare(Object[] o1, Object[] o2) {
        return (int)((Double)o1[2] - (Double)o2[2]);
    }
}
Avatar billede andreas Nybegynder
02. december 2006 - 14:38 #7
Nu har jeg endelig forstået den der Comparator ting - hvordan den virker. Jeg har også fået lavet mig noget kode som jeg kan bruge nu, ud fra dit eksempel. Men kan du lige forklare mig denne ene ting:

implements Comparator<Object[]>

hvad betyder den linie? jeg tænker mest på det med, at du skriver <Object[]> efter Comparator? - Hvorfor? - Og hvad gør den?


Hvis du gider lægge en svar også, så det perfekt da du gav mig en fin løsning ;)
Avatar billede arne_v Ekspert
02. december 2006 - 15:39 #8
den fortæller at det er en Comparator som sammenligner 2 styk Object[]
Avatar billede arne_v Ekspert
02. december 2006 - 15:39 #9
og et svar
Avatar billede andreas Nybegynder
02. december 2006 - 17:39 #10
Det lyder meget "simpelt" - dvs, man kunne også skrive Comperator<String[]> , hvis man ville sammenligne et multi dimensionelt string array som f.eks String[][] test;

?
Avatar billede arne_v Ekspert
02. december 2006 - 18:05 #11
ja

men jeg tror faktisk at du i.s.f. et 2D array rent faktisk bør bruge et 1D array
af en data klasser
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester