使用 Scanner .hasNext(), .next 读取文件时比较字符串

Posted

技术标签:

【中文标题】使用 Scanner .hasNext(), .next 读取文件时比较字符串【英文标题】:Comparing Strings while reading a file with Scanner .hasNext(), .next 【发布时间】:2014-07-29 06:57:37 【问题描述】:

我正在努力为我的 Programm 争取一点高分。该程序有一个日志文件,我想读取该文件并确定获胜者。因为我的程序有一些问题,你可以一遍又一遍地回答同一个问题,并因此获得学分。 使用下面的代码,我试图防止作弊分数。我试图比较第三、第四和第五个字符串,它代表你必须解决的计算。当下一行具有相同的计算时,我想忽略高分的计数 有人可以帮我弄这个吗 ?我只是得到一堆错误。

感谢您的时间和帮助。

public int readFile() 
    String score = null;
    while (scan.hasNext()) 
        String a = scan.next();
        String b = scan.next();
        String c = scan.next();
        String d = scan.next();
        String e = scan.next();
        String f = scan.next();
        String g = scan.next();
        String h = scan.next();
        String i = scan.next();

        if (c.equals(scan.next()) && d.equals(scan.next()) && e.equals(scan.next())) 
         else 
            temp = Integer.parseInt(i);
            if (temp > highscore) 
                highscore = temp;
            
        

    
    return highscore;

文本文件:

    014/07/29 08:25:15  95 + 80 4       false       -171        0
    2014/07/29 08:25:15 95 + 80 4       false       -171        0
    2014/07/29 08:25:49 8 * 3   24      true        0       1
    2014/07/29 08:25:49 8 * 3   24      true        0       2
    2014/07/29 08:25:49 8 * 3   24      true        0       3
    2014/07/29 08:25:50 8 * 3   24      true        0       4
    2014/07/29 08:25:50 8 * 3   24      true        0       5

错误:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "2014/07/28"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at mathe.Highscore.readFile(Highscore.java:42)
    at mathe.Gui$TestActionListener.actionPerformed(Gui.java:231)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

【问题讨论】:

因为 OP 说你可以一遍又一遍地回答同一个问题,并为此获得学分并且没有提供任何堆栈跟踪 我只是得到一堆错误:不,你没有。您收到的每个错误都会附带一条准确的消息,说明问题所在和位置。不阅读它们,不发布它们是错误的。 重新格式化您的数据文件;条目之间只有一个空格。然后,使用String[] entry = scan.nextLine().split(" ");... 这样您就可以以entry[2], [3], ... 的身份访问计算,以同样的方式提前阅读。 【参考方案1】:

如果您在条件语句中继续使用 scan.next,您的扫描器将扫描下一个值。我认为您希望获得下一个值并用于比较。

public int readFile() 
    String score = null;
    while (scan.hasNext()) 
        String a = scan.next();
        String b = scan.next();
        String c = scan.next();
        String d = scan.next();
        String e = scan.next();
        String f = scan.next();
        String g = scan.next();
        String h = scan.next();
        String i = scan.next();

        String nextVal = scan.next();

        if (c.equals(nextVal) && d.equals(nextVal) && e.equals(nextVal)) 
         else 
            temp = Integer.parseInt(i);
            if (temp > highscore) 
                highscore = temp;
            
        

    
    return highscore;

我希望这会有所帮助。 干杯..!

【讨论】:

很遗憾,同样的错误。文本文件有 9 个单独的字符串,id 喜欢将第 1 行的 3,4 和 5 字符串与第 2 行的相同字符串进行比较。 如果要比较上一行,在循环外声明3个变量,类似这里的score。【参考方案2】:

在 if 语句中调用 scan.next() 是个坏主意。第二个 scan.next 只有在第一个 equals 为真时才会被调用,以此类推,因此很容易混淆您要阅读的列。将那些 scan.next 移出 if 语句以供初学者使用。

根据错误消息,您正在对日期字符串调用 Integer.parseInt(i);

您似乎正在尝试查找文件中的最大数字?你应该做的是存储最高的 int,它是在循环外声明的。例如

int Highscore = 0;
while (...) 
   .... 

  int num = Integer.parseInt(i);
  if (num > Highscore) 
    Highscore = num;
   

如果你明白我的意思。

【讨论】:

我认为这应该是一条评论。 它确实对代码有所帮助,但很难说到底是什么问题,无法回答。我敢打赌它可能确实回答了这个问题。 如果没有 if 语句,我如何比较这些字符串? 查看我的编辑。利用现有的变量,而不是通过调用 scan.next 额外的时间。 @Geryones 我正在添加答案。

以上是关于使用 Scanner .hasNext(), .next 读取文件时比较字符串的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何使用Scanner方法“hasNext”作为条件退出java中的while循环?

Java Scanner的hasNext()方法

java的Scanner类的hasNext()方法问题

Java Scanner hasNext(String) 方法有时不匹配

java Scanner和异常

Scanner 与 Readable 的read()方法