Pregunta

He completado la mayor parte del código por mí mismo (con la ayuda de un poco de búsqueda en Google), pero se han topado con un problema inesperado.Primero apagado, tengo que ordenar un usuario entró en la lista de nombres en aplhabetical orden de sus apellidos mediante orden de selección.Aquí está mi código:

    import java.util.*;
class Name_Sort
{
    public static void main (String args[])
    {
        Scanner in = new Scanner (System.in);
        System.out.print ("Enter the number of names you wish to enter: ");
        int n = in.nextInt();
        String ar[] = new String [n];
        for (int i = 0; i<ar.length; i++)
        {
            System.out.print("Please enter the name: ");
            ar[i]= in.nextLine();
        }
        String temp;
        for (int b = 0; b<n; b++)
        {
            for (int j=b+1; j<n; j++)
            {
                if ((compareLastNames(ar[b], ar[j]))>0)
                {
                    temp = ar[b];
                    ar[b] = ar[j];
                    ar[j] = temp;
                }
            }
        }
        System.out.println ("The names sorted in alphabetical order are: ");
        for (int a = 0; a<n; a++)
            System.out.print (ar[a]+"\t");
    }

    private static int compareLastNames(String a, String b) 
    {
        int index_a = a.lastIndexOf(" ");
        String surname_a = a.substring(index_a);
        int index_b = b.lastIndexOf(" ");
        String surname_b = b.substring(index_b);
        int lastNameCmp = surname_a.compareToIgnoreCase(surname_b);
        return lastNameCmp;
    }
}

El problema (creo) es que surgen cuando estoy tomando los nombres del usuario, en particular, esta parte:

Scanner in = new Scanner (System.in);
    System.out.print ("Enter the number of names you wish to enter: ");
    int n = in.nextInt();
    String ar[] = new String [n]; //Array to store the names in.
    for (int i = 0; i<ar.length; i++)
    {
        System.out.println("Please enter the name: ");
        ar[i]= in.nextLine();

    }

La salida en la ventana de terminal de BlueJ se muestra como

Name_Sort.main({ });
Enter the number of names you wish to enter: 5
Please enter the name: 
Please enter the name: 

Eso no es lo que se supone que debe mostrar.¿Qué puedo estar haciendo mal?He reflexionado sobre ello durante un tiempo, pero nada viene a la mente.

Y, aunque me hacen avanzar y entrar en un par de nombres a pesar de que el error anterior, me sale otro error en esta parte de mi código aquí:

private static int compareLastNames(String a, String b) 
{
    int index_a = a.lastIndexOf(" ");
    String surname_a = a.substring(index_a);// This is the line the compiler highlights.
    int index_b = b.lastIndexOf(" ");
    String surname_b = b.substring(index_b);
    int lastNameCmp = surname_a.compareToIgnoreCase(surname_b);
    return lastNameCmp;
}

el error es :

java.lang.StringIndexOutOfBoundsException: String index out of range: -1 (injava.lang.String)

¿Significa esto que el carácter de espacio en blanco " " no está presente?Pero, ¿por qué?

Esta es una captura de pantalla de la ventana de terminal:http://imgur.com/l7yf7Xn

La cosa es que, si acabo de inicializar el array con los nombres de los primeros (y no tomar ninguna entrada del usuario) los códigos funciona bien y produce el resultado deseado.Cualquier ayuda por favor?

También, ya sé que a algunas personas aquí son muy particulares acerca de esto, sí, esto es una tarea en la que, sí, yo hice todo el código por mí mismo, he buscado en google sobre cómo ordenar los nombres en orden alfabético, como no podía exactamente el código de la idea original que tenía.Cual fue la comparación de los valores ASCII de cada carácter de los dos apellidos para ver que debe venir primero.Como: if((int) surname1.charAt(0)>(int) surname2.charAt(0)) a continuación, apellido2 debe venir antes de surname1, por el contrario, si ambos tienen el mismo carácter, tomar el segundo personaje y así sucesivamente.

Gracias por tomarse el tiempo para leer esto.

¿Fue útil?

Solución

El problema es con el in.nextInt() comando sólo se lee el valor int.Así que cuando usted seguir leyendo en.nextLine() recibe el "\n" Tecla Enter.Así que para evitar esto usted tendrá que añadir un extra de in.nextLine() antes de entrar en el bucle.O, utilice otro scanner.

    int n = in.nextInt();
    String ar[] = new String [n]; //Array to store the names in.

    in.nextLine(); // < --- an extra next Line

    for (int i = 0; i<ar.length; i++)
    {
        System.out.println("Please enter the name: ");
        ar[i]= in.nextLine();

    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top