【问题标题】:Incorrect Printing String With Whitespace from ArrayList使用 ArrayList 中的空格打印字符串不正确
【发布时间】:2012-08-11 19:04:57
【问题描述】:

我玩这个游戏,您可以在其中收集数百个道具,而无需记住它们的唯一方法就是查看它们。正因为如此,我试图让自己成为一个“助手”程序,我可以在其中输入电源名称并获得它的效果。

下面是去掉了无用部分的完整代码。输出示例如下。如果您查看输出,问题应该是相当明显的。我可以用什么方法来解决这个问题,或者我做错了什么?

import java.util.ArrayList;
import java.util.Scanner;

public class ProgMain {

 // // *** ------------*** and any variations indicate a change of importance or use

  public static ArrayList<String> itemlist; // ArrayList of items to cycle through to see if item exists in database.

  static {
     itemlist = new ArrayList<String>();

        itemlist.add("genericitem"); // testing item
        itemlist.add("exit"); // allows for internal program exit
        itemlist.add("debuglist"); // allows to print every item in "itemlist" for debug

        // ***-------------------------------------------------***

        itemlist.add(0, "thisitem hasaspace");

  }

static Scanner console = new Scanner (System.in);

public static void main(String[] args) {

    String item = " " // variable to store name of item

    System.out.println("Enter an item name to check the database.");
    System.out.println("Enter 'exit' to quit the program.");
    System.out.println();

    while(true) {
        System.out.print("Item Name: ");
        item = console.next().toLowerCase().replaceAll("\\s", " ");


        /**
         * ONLY FINDS FIRST WORD, even after removal of spaces.
         */
            //DEBUG
        System.out.print("\n     DEBUG: " + item + "\n");

        if (itemlist.contains(item)) { // cycle through database

            displayItemProperties(item); // find item and print properties
            System.out.println();

        } else { // declares if the item isn't found in database
            System.out.println("That item does not exist.");
            System.out.println();
        }
    }
}

static void displayItemProperties(String item) {

    /**
     * Item names must be in LOWERCASE and have NO SPACES.
     */

    // GENERIC IF STATEMENT
    // Easy copy/paste to add new items

    /*

    if (item.equals("")) {
        System.out.println("");
    }

    */
    // **----------------------------------**

    if (item.equals("genericitem")) {
        System.out.println("A generic item.");
    }

    if (item.equals("debuglist")) {
        for (int i = 0; i < itemlist.size(); i++) {
            System.out.println(itemlist.get(i));
        }
    }

    if (item.equals("exit")) {
        System.out.println("Application Terminating...");
        System.exit(0);
    }

    // ***------------------------------------------------------***

    if (item.equals("thisitem hasaspace")) {
        System.out.println("If a name has a space, it wont show up correctly...");
    }

    // introduce new item declarations here     
}
}

这是没有空格输入的内容的示例输出:

Enter an item name to check the database.
Enter 'exit' to quit the program.

Item Name: genericitem

 DEBUG: genericitem
A generic item.

Item Name: exit

 DEBUG: exit
Application Terminating...

这就是使用带空格的名称时会发生的情况:

Enter an item name to check the database.
Enter 'exit' to quit the program.

Item Name: thisitem hasaspace

 DEBUG: thisitem
That item does not exist.

Item Name:

 DEBUG: hasaspace
That item does not exist.

Item Name: exit

 DEBUG: exit
Application Terminating...

【问题讨论】:

    标签: java console-application


    【解决方案1】:

    Scanner 类默认使用任何空格作为分隔符模式。这包括一个普通的SPACE。因此,当您调用Scanner.next() 时,它会拉出下一个标记,而 thisite hasaspace 是 2 个单独的标记,因为空格是默认分隔符。

    不要调用Scanner.next(),而是尝试调用Scanner.nextLine()

        item = console.nextLine().toLowerCase().replaceAll("\\s", " ");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 2020-12-29
      • 2022-06-28
      • 1970-01-01
      • 2022-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多