Question

J'ai complété la majeure partie du code par moi-même (avec l'aide d'un peu de recherche sur Google) mais j'ai rencontré un problème inattendu.Tout d’abord, je dois trier une liste de noms saisie par l’utilisateur par ordre alphabétique de leurs noms de famille à l’aide du tri par sélection.Voici mon 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;
    }
}

Le problème (je pense) survient lorsque je prends les noms de l'utilisateur, en particulier cette partie :

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 sortie sur la fenêtre du terminal de BlueJ s'affiche comme suit :

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

Ce n'est pas ce qu'il est censé afficher.Qu’est-ce que je pourrais faire de mal ?J'y réfléchis depuis un moment, mais rien ne me vient à l'esprit.

Et, même si j'avance et saisis quelques noms malgré l'erreur ci-dessus, j'obtiens une autre erreur dans cette partie de mon code ici :

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'erreur est :

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

Cela signifie-t-il que le caractère espace " " n'est pas présent?Mais pourquoi?

Voici une capture d'écran de la fenêtre du terminal :http://imgur.com/l7yf7Xn

Le fait est que si j'initialise d'abord le tableau avec les noms (et que je ne prends aucune entrée de l'utilisateur), les codes fonctionnent correctement et produisent le résultat souhaité.Une aide s'il vous plaît ?

De plus, comme je sais que certaines personnes ici sont très particulières à ce sujet, oui, c'est un devoir, oui, j'ai fait tout le code moi-même, j'ai cherché sur Google comment trier les noms par ordre alphabétique car je ne pouvais pas coder exactement l’idée originale que j’avais.Il s'agissait de comparer les valeurs ASCII de chaque caractère de deux noms de famille pour voir lequel devait venir en premier.Comme: if((int) surname1.charAt(0)>(int) surname2.charAt(0)) alors le nom2 doit venir avant le nom1, sinon s'ils ont tous les deux le même premier caractère, prenez le deuxième caractère et ainsi de suite.

Merci d'avoir pris le temps de lire ceci.

Était-ce utile?

La solution

Le problème vient du in.nextInt() commande, il lit uniquement la valeur int.Ainsi, lorsque vous continuez à lire avec in.nextLine(), vous recevez le "\n" La touche Entrée.Donc pour contourner ce problème, vous devrez ajouter un supplément in.nextLine() avant de rentrer dans la boucle.Ou utilisez-en un autre 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();

    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top