Domanda

Ho completato la maggior parte del codice da solo (con l'aiuto di un po' di ricerca su Google), ma mi sono imbattuto in un problema imprevisto.Prima di tutto, devo ordinare un elenco di nomi inserito dall'utente in ordine aalfabetico dei loro cognomi utilizzando l'ordinamento di selezione.Ecco il mio codice:

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

Il problema (credo) sorge quando prendo i nomi dell'utente, in particolare, questa 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();

    }

L'output nella finestra del terminale di BlueJ si presenta come

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

Non è quello che dovrebbe mostrare.Cosa potrei fare di sbagliato?Ci penso da un po', ma non mi viene in mente nulla.

E, anche se vado avanti e inserisco alcuni nomi nonostante l'errore precedente, ottengo un altro errore in questa parte del mio codice qui:

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

l'errore è:

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

Questo significa che il carattere dello spazio bianco " " non è presente?Ma perché?

Questo è uno screenshot della finestra del terminale:http://imgur.com/l7yf7Xn

Il fatto è che, se inizializzo prima l'array con i nomi (e non prendo alcun input dall'utente), i codici funzionano correttamente e producono il risultato desiderato.Qualche aiuto per favore?

Inoltre, poiché so che alcune persone qui sono molto esigenti al riguardo, sì, questo è un compito a casa, sì, ho fatto tutto il codice da solo, ho cercato su Google come ordinare i nomi in ordine alfabetico perché non potevo codificare esattamente l'idea originale che avevo.Si trattava di confrontare i valori ASCII di ciascun carattere di due cognomi per vedere quale dovesse venire per primo.Come: if((int) surname1.charAt(0)>(int) surname2.charAt(0)) allora cognome2 dovrebbe precedere cognome1, altrimenti se entrambi hanno lo stesso primo carattere, prendi il secondo carattere e così via.

Grazie per aver dedicato del tempo a leggere questo.

È stato utile?

Soluzione

Il problema è con il in.nextInt() comando legge solo il valore int.Quindi quando continui a leggere con in.nextLine() ricevi il file "\n" Tasto Invio.Quindi per aggirare questo problema dovrai aggiungere un extra in.nextLine() prima di entrare nel giro.Oppure usane un altro 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();

    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top