我自己完成了大部分代码(借助一些谷歌搜索)但我遇到了一个意想不到的问题。首先,我必须使用选择排序对用户输入的姓名列表进行排序。这是我的代码:
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))
那么surname2应该在surname1之前,否则如果它们都具有相同的第一个字符,则取第二个字符,依此类推。
感谢您花时间阅读本文。
答案 0 :(得分:3)
问题在于in.nextInt()
命令它只读取int值。因此,当您继续使用in.nextLine()阅读时,您会收到"\n"
Enter键。因此,为了解决这个问题,您必须在进入循环之前添加额外的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();
}