我自己完成了大部分代码(在一些谷歌搜索的帮助下),但我遇到了一个意想不到的问题。首先,我必须使用选择排序对用户输入的姓名列表按姓氏的字母顺序进行排序。这是我的代码:

    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 之前,否则如果它们的第一个字符相同,则取第二个字符,依此类推。

感谢您抽时间阅读。

有帮助吗?

解决方案

问题在于 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