Frage

Ich habe den größten Teil des Codes selbst fertiggestellt (mit Hilfe von ein wenig Googeln), bin aber auf ein unerwartetes Problem gestoßen.Zunächst muss ich eine vom Benutzer eingegebene Namensliste mithilfe der Auswahlsortierung in alphabetischer Reihenfolge ihrer Nachnamen sortieren.Hier ist mein Code:

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

Das Problem (glaube ich) entsteht, wenn ich die Namen des Benutzers übernehme, insbesondere diesen Teil:

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();

    }

Die Ausgabe im Terminalfenster von BlueJ wird als angezeigt

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

Das ist nicht das, was es anzeigen soll.Was könnte ich falsch machen?Ich habe eine Weile darüber nachgedacht, aber mir fällt nichts ein.

Und selbst wenn ich trotz des obigen Fehlers fortfahre und ein paar Namen eingebe, erhalte ich in diesem Teil meines Codes hier einen weiteren Fehler:

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

der Fehler ist:

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

Bedeutet dies, dass das Leerraumzeichen " " ist nicht hier?Aber warum?

Dies ist ein Screenshot des Terminalfensters:http://imgur.com/l7yf7Xn

Die Sache ist, wenn ich das Array einfach zuerst mit den Namen initialisiere (und keine Eingaben vom Benutzer entgegennehme), läuft der Code einwandfrei und liefert das gewünschte Ergebnis.Bitte helfen Sie mir?

Da ich außerdem weiß, dass einige Leute hier sehr wählerisch sind, ja, das ist eine Hausaufgabe, ja, ich habe den gesamten Code selbst gemacht, habe gegoogelt, wie ich die Namen in alphabetischer Reihenfolge sortieren kann, da ich es nicht konnte Codieren Sie genau die ursprüngliche Idee, die ich hatte.Dabei wurden die ASCII-Werte jedes Zeichens zweier Nachnamen verglichen, um zu sehen, welches zuerst kommen sollte.Wie: if((int) surname1.charAt(0)>(int) surname2.charAt(0)) dann sollte Nachname2 vor Nachname1 stehen, andernfalls, wenn beide das gleiche erste Zeichen haben, das zweite Zeichen nehmen und so weiter.

Vielen Dank, dass Sie sich die Zeit genommen haben, dies zu lesen.

War es hilfreich?

Lösung

Das Problem liegt bei der in.nextInt() Befehl liest es nur den int-Wert.Wenn Sie also mit in.nextLine() weiterlesen, erhalten Sie die "\n" Enter-Taste.Um dies zu umgehen, müssen Sie also ein Extra hinzufügen in.nextLine() bevor man in die Schleife geht.Oder verwenden Sie ein anderes 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();

    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top