Pergunta

Concluí a maior parte do código sozinho (com a ajuda de um pouco de pesquisa no Google), mas me deparei com um problema inesperado.Primeiro, preciso classificar uma lista de nomes inserida pelo usuário em ordem alfabética de seus sobrenomes usando classificação por seleção.Aqui está o meu 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;
    }
}

O problema (eu acho) surge quando estou pegando os nomes do usuário, especificamente, 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();

    }

A saída na janela do terminal do BlueJ aparece como

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

Não é isso que deveria exibir.O que eu poderia estar fazendo de errado?Eu ponderei sobre isso por um tempo, mas nada me vem à mente.

E, mesmo que eu avance e insira alguns nomes, apesar do erro acima, recebo outro erro nesta parte do meu código aqui:

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;
}

o erro é:

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

Isso significa que o caractere de espaço em branco " " não está presente?Mas por que?

Esta é uma captura de tela da janela do terminal:http://imgur.com/l7yf7Xn

O problema é que, se eu apenas inicializar o array com os nomes primeiro (e não receber nenhuma entrada do usuário), os códigos funcionarão bem e produzirão o resultado desejado.Alguma ajuda, por favor?

Além disso, como sei que algumas pessoas aqui são muito específicas sobre isso, sim, isso é uma tarefa de casa, sim, eu fiz todo o código sozinho, pesquisei no Google como classificar os nomes em ordem alfabética, pois não consegui codifique exatamente a ideia original que tive.Que foi comparar os valores ASCII de cada caractere de dois sobrenomes para ver qual deveria vir primeiro.Como: if((int) surname1.charAt(0)>(int) surname2.charAt(0)) então o sobrenome2 deve vir antes do sobrenome1; caso contrário, se ambos tiverem o mesmo primeiro caractere, pegue o segundo caractere e assim por diante.

Obrigado por tomar o tempo para ler este.

Foi útil?

Solução

O problema está com o in.nextInt() comando, ele apenas lê o valor int.Então, quando você continua lendo com in.nextLine() você recebe o "\n" Tecla Enter.Então, para contornar isso, você terá que adicionar um extra in.nextLine() antes de entrar no loop.Ou use outro 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top