【问题标题】:Sorting names entered by the user in alphabetical order according to the last name根据姓氏按字母顺序对用户输入的名称进行排序
【发布时间】: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)&gt;(int) surname2.charAt(0)) 那么 surname2 应该在 surname1 之前,否则如果它们的第一个字符相同,则取第二个字符,依此类推。

感谢您花时间阅读本文。

【问题讨论】:

  • "将用户输入的名字按照姓氏的字母顺序排序 - JAVA" 不需要对我们大喊大叫,应该是"排序用户按姓氏字母顺序输入的名称 - Java"。再说一遍,问题标题中不需要添加主要标签,所以它应该是“根据姓氏按字母顺序对用户输入的名称进行排序”.
  • 如果您认为我在大喊大叫,我很抱歉。我想通过将 Java 放在问题标题中,人们不必点击我的问题来查看它使用的是哪种语言。

标签: java sorting indexoutofboundsexception selection-sort


【解决方案1】:

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

    }

【讨论】:

  • 或者使用另一个Scanner
  • 感谢您的帮助!此外,您的答案中有一个小错字:in.nexrLine()。但是非常感谢!
猜你喜欢
  • 2020-09-10
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多