【问题标题】:How to use Scanner methods when scanning a String?扫描字符串时如何使用 Scanner 方法?
【发布时间】:2016-03-09 05:32:18
【问题描述】:

我有一个文本文件,其中包含几行由空格分隔的小整数列表。我要扫描第一行,并为第一行中的每个整数做一些事情。

    String lineString = textScan.nextLine(); //scans the first line of the text file.
    Scanner Line = new Scanner(lineString); //scans the String retrieved from the text file.

    while (Line.hasNextInt())
    { //do stuff 
    }

所以我有一个扫描仪 (textScan),它扫描文本文件的第一行,然后将其保存为字符串。然后我有第二个扫描仪扫描字符串以检查其中的值是否为整数。

但是 while 语句不允许我使用“Line.hasNextInt”来扫描字符串!那么如何扫描 String 行以确定它是否有整数?

编辑: 对不起,我的措辞有误。循环将无限运行,所以我尝试在循环之前创建一个打印语句:System.out.println(Line);,它打印出这个错误:

java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match 有效=假] [需要输入=假] [来源 closed=false][skipped=false][group separator=\,][decim al 分隔符=.][正前缀=][负前缀=\Q-\E][正 后缀=][负后缀=][NaN字符串=\Q?\E][无穷大字符串=\Q∞\E]

奇怪的是它编译得很好?

输入文件:

5 4 4 3 5 
4 2 2 5 3 
5 2 5 2 3 
5 4 3 2 3 
5 4 2 2 5 
4 4 2 4 2 
3 3 5 3 5 
5 2 4 5 2 
4 4 5 4 2 
2 4 3 5 2 
3 3 3 5 3 
2 4 5 3 4 
3 5 5 4 3 
3 4 2 2 4 
5 5 5 4 4 
3 4 4 4 5 
3 2 4 2 4 
5 4 4 2 4 
5 3 5 2 3 

【问题讨论】:

  • “不允许我使用” 什么意思?有编译错误信息吗?程序运行时出现异常?请编辑问题以包含您遇到的具体问题。
  • 究竟每一行有什么格式
  • 还要考虑正则表达式是否更适合您的需求

标签: java


【解决方案1】:

我看到了问题。 您需要在循环内使用Line.nextInt() 来移动光标。

如果不是,则 Line 始终指向开头,循环永远不会结束。

要正确使用它,请调用 nextInt() 以便它获取下一个令牌:

while (Line.hasNextInt())
{ 
     System.out.println(Line.nextInt());
}

无限循环:

while (Line.hasNextInt())
{ 
     System.out.println("Infinity");
}

【讨论】:

  • 啊,你是对的!这似乎是个问题!这就说得通了。有没有办法将光标移到下一个对象上(或从字符串列表中删除对象)而不打印出来?
  • 是的,只需调用Line.nextInt(); 方法即可。不必分配或保存其值或在任何地方打印。在循环内,作为第一条语句,您可以调用 Line.nextInt() 然后继续您的处理。只要在循环内调用nextInt(),它就会起作用。如果问题已解决,您能否接受答案并结束问题?
  • 哦,多么有趣,我不知道你能做到这一点!谢谢,解决了两个问题! :P 哦,对不起,我只是让你的未接受时间稍长一点,以便在这里看到我的评论。
【解决方案2】:

您无需使用扫描仪解决该问题。

public static void main(String[] args) {

    String myString = "This is not int";
    String myInt = "123456";
    int copyOfInt = 0;
    try {
        copyOfInt = Integer.parseInt(myInt);
        System.out.println(copyOfInt);
        copyOfInt = Integer.parseInt(myString);
        System.out.println(myString);
    } catch (Exception e) {
        System.out.println("Not int");
    }
    // Put this in a loop and you can keep doing stuff
}

或者你可以使用我认为更好的 FileInputStream。 这是一个例子:

    try (FileInputStream readFile = new FileInputStream(refFile);
            InputStreamReader readIn = new InputStreamReader(readFile, "UTF8")) {
        BufferedReader ReadBuffer = new BufferedReader(readIn);
        String line = "";
        while ((line = ReadBuffer.readLine()) != null) {
            // Search my string of interest 
            if (line.equals("Potential/V, Current/A")) {
                while ((line = ReadBuffer.readLine()) != null) {
                    // Get data after string of interest 
                    // Use createDataType_1_Object() to get my data
                    myDataArray.add(createDataType_1_Object(line));
                }
            }
        }
    } catch (Exception e) {
        System.out.println(e);
    }

【讨论】:

  • 我认为 Scanner 在这里要简单得多。我会更喜欢一个扫描仪,另一个使用正则表达式或字符串拆分。这将比任何其他解决方案都简单得多。
  • 我同意你的观点,我认为这更像是个人喜好。
【解决方案3】:

抱歉,如果您在同一行中有多个整数,您可以使用分隔符将它们拆分并仍然使用单个扫描仪,因此之前误解了您的问题:

String yourFilename = "filename.txt";

File file = new File(yourFilename).useDelimiter(" ");
Scanner sn = new Scanner(file);

while(sn.hasNextInt()){
// Do your work here
}

【讨论】:

  • 这将读取文件的所有行。 @Guy 想要的是只读取第一行,然后单独解析该行以获得 int。所以要么需要 2 个扫描器,要么需要一个扫描器来读取输入,然后他需要在该字符串上使用 split 来获取它。
【解决方案4】:

在while循环中你需要输入布尔表达式:

while(Boolean_expression)
{
   //Statements
}

您不会将String 作为参数输入到 Scanner 类中。 扫描仪类需要InputStream source ->谢谢你的cmets,我的错。

【讨论】:

  • Java API 从指定的字符串生成扫描器意味着什么,那么? docs.oracle.com/javase/8/docs/api/java/util/…
  • @Thomas 这实际上是有效的。 Scanner(String source) 构造一个新的扫描器,它产生从指定字符串扫描的值。如果需要,您可以尝试此示例代码。 Scanner Line = new Scanner("5 4 4 3 5");while (Line.hasNextInt())System.out.println(Line.nextInt());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多