Сортировка введенных пользователем имен в алфавитном порядке по фамилии
-
21-12-2019 - |
Вопрос
Я написал большую часть кода самостоятельно (с помощью небольшого поиска в 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();
}