排序还检查输入的名称是否是单词(即它的字符是字母,而不是数字或标点符号等)

时间:2016-03-16 01:50:42

标签: java arrays string loops sorting

所以我有这个代码,它接受一个名字数组并按字母顺序对它们进行排序。我想知道如何检查输入的名称是否是单词(即它的字符是字母,而不是数字或标点符号等)。如果没有打印出来的"输入的名称是不正确的重新运行代码"感谢先进的帮助!

import java.util.Scanner;

public class Alphabetical_Order

{
    public static void main(String[] args) 


    {

        int n;

        String temp;
        Scanner s = new Scanner(System.in);
        System.out.print("Enter number of names you want to enter:");
        n = s.nextInt();
        String names[] = new String[n];
        Scanner s1 = new Scanner(System.in);
        System.out.println("Enter all the names:");
        for(int i = 0; i < n; i++)
        {
            names[i] = s1.nextLine();
        }
        for (int i = 0; i < n; i++) 
        {
            for (int j = i + 1; j < n; j++) 
            {
                if (names[i].compareTo(names[j])>0) 
                {
                    temp = names[i];
                    names[i] = names[j];
                    names[j] = temp;
                }
            }
        }
        System.out.print("Sorted Order:");
        for (int i = 0; i < n - 1; i++) 
        {
            System.out.print(names[i] + ",");
        }
        System.out.print(names[n - 1]);
    }
}

2 个答案:

答案 0 :(得分:2)

根据您对“字母”的定义,以下之一将执行:

private static boolean isAllEnglishLetters(String text) {
    return text.matches("[a-zA-Z]+");
}
private static boolean isAllEnglishLetters(String text) {
    return text.matches("\\p{Alpha}+"); // An alphabetic character: [a-zA-Z]
}
private static boolean isAllUnicodeLetters(String text) {
    return text.matches("\\p{L}+"); // A unicode letter category
}

<强> TEST

public static void main(String[] args) {
    System.out.printf("%17s %s%n", "English", "Unicode");
    test("John");
    test("JohnDoe");
    test("Schäfer");
    test("John2");
    test("John.Doe");
    test("John Doe");
}
private static void test(String text) {
    System.out.printf("%-10s %-5s   %-5s%n", text, isAllEnglishLetters(text),
                                                   isAllUnicodeLetters(text));
}

<强>输出

          English Unicode
John       true    true 
JohnDoe    true    true 
Schäfer    false   true       <-- Notice this
John2      false   false
John.Doe   false   false
John Doe   false   false

<强>更新

上面的代码显示了一个可重用的方法,可以在需要时简单地调用它。您当然可以直接进行matches()电话,例如

for(int i = 0; i < n; i++)
{
    names[i] = s1.nextLine();
    if (! names[i].matches("\\p{L}+"))
    {
        System.out.println("name entered is incorrect re run code");
        return; // exit program
    }
}

答案 1 :(得分:0)

一个选项是用所有内容替换所有非单词字符,并检查结果字符串的长度是否仍然相同。这是一个完成此任务的单行方法:

private static boolean isAllEnglishLetters(String text) {
    return name.replaceAll("[^a-zA-Z]", "").length() == name.length();
}