2010-12-05 10 views
2

J'ai mis en œuvre le tri à bulles pour trier un java long [] [] bidimensionnel mais mon dieu est-il lent, je vais avoir besoin de l'algorithme à jeun possible comme je vais générer un tableau de la max taille du tas jvm me permettra,tri 2 dimensions java array

donc je pense que le meilleur et le plus rapide serait d'utiliser la inbuild java Arrays.sort

Je ne l'esprit si elle ne peut sorte sur la première colonne que je peux changer mon programme à suivre, Je suis tombé sur ce sujet, mais je ne suis pas familier avec le comaparator,

cela me permettra de trier un tableau dimensionnel d'entiers, est-ce que quelqu'un sait comment changer cela pour permettre des longs ?, J'ai fait le tour avec lui sans joie pour le moment.

int d2 [][] = {{1,43},{26,98},{44,398},{11,34},{17,32}}; 

java.util.Arrays.sort(d2, new java.util.Comparator<int[]>() { 
    public int compare(int[] a, int[] b) { 
     return b[0] - a[0]; 
    } 
}); 

je veux dire trier

long d2L [][] = {{1,43},{26,98},{44,398},{11,34},{17,32}}; 

coulée n'est pas une option que les numéros un massif

Aussi, si quelqu'un pense theres une méthode plus rapide pour trier im toutes les oreilles :)

Répondre

2

Ce sortes à base de toutes les colonnes de O (n log n), soit très rapide:

import java.util.*; 

class Compare2DArray implements Comparator { 
    public int compare(Object a, Object b) { 
    int aa[] = (int[]) a; 
    int bb[] = (int[]) b; 
    for (int i = 0; i < aa.length && i < bb.length; i++) 
     if (aa[i] != bb[i]) 
     return aa[i] - bb[i]; 
    return aa.length - bb.length; 
    } 
} 

class sort2d { 
    public static void main(String args[]) { 
    int d2 [][] = {{1,43},{26,98},{44,398},{11,34},{17,32}}; 
    Arrays.sort(d2, new Compare2DArray()); 
    for (int i = 0; i < d2.length; i++) { 
     for (int j = 0; j < d2[i].length; j++) 
     System.out.print(d2[i][j] + " "); 
     System.out.println(); 
    } 
    } 
} 

http://ideone.com/TjEOL

Ou vous pouvez utiliser génériques pour éviter la coulée:

class Compare2DArray implements Comparator<int[]> { 
    public int compare(int a[], int b[]) { 
    for (int i = 0; i < a.length && i < b.length; i++) 
     if (a[i] != b[i]) 
     return a[i] - b[i]; 
    return a.length - b.length; 
    } 
} 
+0

merci Marcog, j'ai eu ma question originale de travailler avec des longs, je prends les deux sont similaires si vous pensez que cela fonctionnera plus vite je peux l'implémenter – user524156

1

Il suffit d'utiliser une méthode de comparaison comme ceci:

public int compare(long[] a, long[] b) { 
    if(a[0] < b[0]) { 
     return -1; 
    } else if(a[0] > b[0]) { 
     return 1; 
    } else { 
     return 0; 
    } 
} 

Je commencerais avec le Arrays.sort intégré. Cela fonctionnera beaucoup, beaucoup plus vite que le tri à bulles. Si elle est toujours pas assez vite, regardez les algorithmes ici: http://en.wikipedia.org/wiki/Sorting_algorithms

+0

thats pour la réponse Adam, je vais lancer un test de vitesse sur ce maintenant – user524156

+0

tri à bulles pour trier 100 000 e lements = 50,9 secondes, cette méthode = 1,31seconds :) – user524156