Ordenar matriz de tipo String de dos dimensiones por orden alfabético en Java

publicado por: Anonymous

estoy realizando un ejercicio pero me presenta un error al llegar a la linea donde se ordena, lo estoy ordenando con la funcion sort, acá el ejercicio

Capturar una matriz que me permita almacenar nombres de personas, mostrar la 
matriz original y
ordenarlos por orden alfabético.

El codigo

import java.util.Arrays;
import java.util.Scanner;

public class NombresPersonas {

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);

    //array a ordenar
    //String cadenas[]={"Fernando","Pepe","Alejandro","Alfredo","Eufrasio"};


    System.out.println("Ingrese el numero de filas: ");
    int filas = sc.nextInt();

    System.out.println("Ingrese el numero de columnas: ");
    int columnas = sc.nextInt();

    String cadenas[][] = new String [filas][columnas];

    for (int i = 0; i < cadenas.length; i++) {
        for (int j = 0; j < cadenas[0].length; j++) {
            System.out.println("Ingrese un nombre para la casilla [" + i + "][" + j + "]");
            cadenas[i][j] = sc.next();
        }
    }

    Arrays.sort(cadenas);

    //Mostramos el array ya ordenado
    for (String i[] : cadenas) {
        for(String k: i){
            System.out.println(i);
        }
    }  
 }   
}

El error

Ingrese el numero de filas: 
2
Ingrese el numero de columnas: 
2
Ingrese un nombre para la casilla [0][0]
pedro
Ingrese un nombre para la casilla [0][1]
jesus
Ingrese un nombre para la casilla [1][0]
alfonso
Ingrese un nombre para la casilla [1][1]
carlos
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.String; 
cannot be cast to java.lang.Comparable
at
java.util.ComparableTimSort.countRunAndMakeAscending
(ComparableTimSort.java:32   )

at java.util.ComparableTimSort.sort(ComparableTimSort.java:188)
at java.util.Arrays.sort(Arrays.java:1246)
at NombresPersonas.main(NombresPersonas.java:29)
C:UsersJosé PadrónAppDataLocalNetBeansCache8.2executor- 
snippetsrun.xml:53: Java returned: 1
BUILD FAILED (total time: 8 seconds)

Qué estoy haciendo mal?

PD: acabo de hacer una mejora al código pero solo me ordena los nombres por filas

import java.util.Arrays;
import java.util.Scanner;

public class NombresPersonas {

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);

    //array a ordenar
    //String cadenas[]={"Fernando","Pepe","Alejandro","Alfredo","Eufrasio"};


    System.out.println("Ingrese el numero de filas: ");
    int filas = sc.nextInt();

    System.out.println("Ingrese el numero de columnas: ");
    int columnas = sc.nextInt();

    String cadenas[][] = new String [filas][columnas];

    for (int i = 0; i < cadenas.length; i++) {
        for (int j = 0; j < cadenas[0].length; j++) {
            System.out.println("Ingrese un nombre para la casilla [" + i + "][" + j + "]");
            cadenas[i][j] = sc.next();
        }
    }

    System.out.println("Matriz original: ");
   imprimir(cadenas);

    for(String[] i: cadenas){
        Arrays.sort(i);
    }

    System.out.println("Matriz ordenada alfábeticamente: ");
    imprimir(cadenas);

}   

 public static void imprimir(String M[][]){ 
    System.out.println(); 
    for (int i=0; i<M.length; i++){ 
        for (int j=0; j<M[0].length; j++) 
            System.out.print(M[i][j]+" "); 
        System.out.println(); 
    } 
    System.out.println(); 
 }

}

solución

Con la mejora que mencionas obtienes como resultado una serie de arreglos ordenados con los que sería posible hacer un merge a un arreglo unidimensional que al final podrías pasar a uno bidimensional. Sin embargo eso es dar muchas vueltas, ¿Por qué no simplemente te olvidas de la estructura de matríz por un rato y simplemente la construyes al final?. Sería algo así:

// Lo mismo hasta la petición de datos
System.out.println("Ingrese el numero de filas: ");
int filas = sc.nextInt();

System.out.println("Ingrese el numero de columnas: ");
int columnas = sc.nextInt();

String cadenas_unidim[] = new String [filas*columnas];
String cadenas_bidim[][] = new String [filas][columnas];        
for (int i = 0; i < filas; i++) {
    for (int j = 0; j < columnas; j++) {
       System.out.println("Ingrese un nombre para la casilla [" + i + "][" + j + "]");
        cadenas_bidim[i][j] = cadenas_unidim[i*columnas + j] = sc.next()
    }
}

System.out.println("Matriz original: ");
imprimir(cadenas_bidim);

Arrays.sort(cadenas_unidim); // Se ordena el arreglo unidimensional

for (int i = 0; i < filas; i++) // Se copia el arreglo ordenado en la matriz
    for (int j = 0; j < columnas; j++)
        cadenas_bidim[i][j] = cadenas_unidim[i*columnas + j];

// Lo mismo para imprimir los datos
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *