useDelimiter问题

时间:2013-11-20 18:36:57

标签: java

我正在制作一个基本的吉他库存,我正在用扫描仪进行测试,我正在尝试扫描一个空白条目,当有一个空白条目时,它应该打印“ANY”,它确实,我是使用scan.useDelimiter(“\ z”);现在,当我输入一个像“挡泥板”这样的正确条目时,它应该打印“FENDER”,但它只是打印“ANY”,好像条目不正确..有人知道我能做些什么来解决这个问题?这是一个sscce:

import java.util.Scanner;

public class SSCCE {

    public static void main(String[] args)
    {
        System.out.println("Enter a builder name: ");
        Scanner scan = new Scanner(System.in);
        scan.useDelimiter("\\z"); // count a blank entry (end of input)


        String entry_1 = scan.next();


        if (entry_1.equalsIgnoreCase("FENDER")
                        || entry_1.equalsIgnoreCase("MARTIN")
                        || entry_1.equalsIgnoreCase("GIBSON")
                        || entry_1.equalsIgnoreCase("COLLINGS")
                        || entry_1.equalsIgnoreCase("OLSON")
                        || entry_1.equalsIgnoreCase("RYAN") 
                        || entry_1.equalsIgnoreCase("PRS")) 
        {
            entry_1 = entry_1.toUpperCase();

            System.out.println(entry_1);
        }

        else
        {       
            entry_1 = "ANY";

            System.out.println(entry_1);
        }   
    }

}

3 个答案:

答案 0 :(得分:3)

默认情况下,扫描程序会从其返回的标记中删除分隔符。当分隔符是换行符(默认值)时,当您执行挡泥板时,entry_1被指定为“挡泥板”。更改分隔符后,不再删除由enter引起的换行符,因此在entry_1中会出现“fender \ n”,导致if条件失败。

要修复,只需执行String entry_1 = scan.next()。trim();相反,它删除尾随的换行符。

答案 1 :(得分:1)

您可以尝试打印扫描值,以查看它不会进入if语句的原因。

import java.util.Scanner;

public class SSCCE {

public static void main(String[] args)
{
    System.out.println("Enter a builder name: ");
    Scanner scan = new Scanner(System.in);
    scan.useDelimiter("\\z"); // count a blank entry (end of input)


    String entry_1 = scan.next();

    System.out.println("Input = [" + entry_1 + "]");

    // rest of the code...
}

答案 2 :(得分:0)

我认为这是由于您使用\\z。请查看此regex tutorial以获取更详细的故事。为了解决您的问题,只需将其更改为\\Z即可。以下代码对我有用:

public static final Set<String> names = Sets.newHashSet("martin", "gibson", ...);

public static void main(String[] args) {
    System.out.println("Enter a builder name: ");
    Scanner scan = new Scanner(System.in);
    scan.useDelimiter("\\Z"); // count a blank entry (end of input)

    String entry = scan.next();
    entry = "any" if (!names.contains(entry.toLowerCase());
    System.out.println(entry.toUpperCase());
}

注意:我假设您一次扫描一个名称。如果没有,那么只需使用换行符。