Сортировка введенных пользователем имен в алфавитном порядке по фамилии

StackOverflow https://stackoverflow.com//questions/20028671

Вопрос

Я написал большую часть кода самостоятельно (с помощью небольшого поиска в Google), но столкнулся с неожиданной проблемой.Во-первых, мне нужно отсортировать введенный пользователем список имен в алфавитном порядке их фамилий, используя сортировку выбором.Вот мой код:

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

Проблема (я думаю) возникает, когда я беру имена у пользователя, в частности, эту часть:

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

    }

Вывод в окне терминала BlueJ отображается как

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

Это не то, что он должен отображать.Что я могу делать неправильно?Я долго размышлял над этим, но ничего не приходило в голову.

И даже если я двинусь дальше и введу несколько имен, несмотря на ошибку выше, я получу еще одну ошибку в этой части моего кода:

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

ошибка:

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

Означает ли это, что символ пробела " " нет?Но почему?

Это скриншот окна терминала:http://imgur.com/l7yf7Xn

Дело в том, что если я сначала просто инициализирую массив именами (и не принимаю никаких данных от пользователя), коды работают нормально и дают желаемый результат.Любая помощь, пожалуйста?

Кроме того, поскольку я знаю, что некоторые люди здесь очень разборчивы в этом, да, это домашнее задание, да, я написал весь код сам, я погуглил, как сортировать имена в алфавитном порядке, так как не смог точно закодировать мою первоначальную идею.Это сравнение значений ASCII каждого символа двух фамилий, чтобы увидеть, что должно быть первым.Нравиться: if((int) surname1.charAt(0)>(int) surname2.charAt(0)) тогда фамилия2 должна идти перед фамилией1, иначе, если они оба имеют один и тот же первый символ, возьмите второй символ и так далее.

Спасибо, что нашли время прочитать это.

Это было полезно?

Решение

Проблема заключается в in.nextInt() команда, она считывает только значение int.Итак, когда вы продолжите чтение с помощью in.nextLine(), вы получите "\n" Введите ключ.Чтобы обойти это, вам придется добавить дополнительный in.nextLine() прежде чем войти в цикл.Или используйте другой 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();

    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top