根据姓氏对用户输入的名称按字母顺序排序

时间:2013-11-17 08:19:12

标签: java sorting indexoutofboundsexception selection-sort

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

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

感谢您花时间阅读本文。

1 个答案:

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

    }