【发布时间】:2013-11-30 11:23:50
【问题描述】:
我自己完成了大部分代码(借助一些谷歌搜索),但我遇到了一个意想不到的问题。首先,我必须使用选择排序按姓氏的 aplhabetical 顺序对用户输入的姓名列表进行排序。这是我的代码:
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 之前,否则如果它们的第一个字符相同,则取第二个字符,依此类推。
感谢您花时间阅读本文。
【问题讨论】:
-
"将用户输入的名字按照姓氏的字母顺序排序 - JAVA" 不需要对我们大喊大叫,应该是"排序用户按姓氏字母顺序输入的名称 - Java"。再说一遍,问题标题中不需要添加主要标签,所以它应该是“根据姓氏按字母顺序对用户输入的名称进行排序”.
-
如果您认为我在大喊大叫,我很抱歉。我想通过将 Java 放在问题标题中,人们不必点击我的问题来查看它使用的是哪种语言。
标签: java sorting indexoutofboundsexception selection-sort