Java 实现useDelimiter方法

Java 实现useDelimiter方法,java,Java,我有下面的代码,请记住,我刚刚开始学习一门语言,并且一直在寻找相当简单的练习。欢迎您和评论家 import java.util.*; import java.io.*; public class Tron { public static void main(String[] args) throws Exception { int x,z,y = 0; File Tron= new File("C:\\Java\\wordtest.txt");

我有下面的代码,请记住,我刚刚开始学习一门语言,并且一直在寻找相当简单的练习。欢迎您和评论家

import java.util.*;
import java.io.*;

public class Tron
{
    public static void main(String[] args) throws Exception
    {
        int x,z,y = 0;
        File Tron= new File("C:\\Java\\wordtest.txt");
        Scanner word = new Scanner(Tron);
        HashMap<String, Integer> Collection = new HashMap<String, Integer>();
        //noticed that hasNextLine and hasNext both work.....why one over the other?
        while (word.hasNext())
        {
            String s = word.next();
            Collection.get(s);
            if (Collection.containsKey(s))
            {
                Integer n = Collection.get(s);
                n = n+1;
                Collection.put(s,n);
                //why does n++ and n+1 give you different results
            }else
            {
                Collection.put(s,1);
            }       
        }
        System.out.println(Collection);


    }   
}
插入
useDelimiter
方法,如下所示

Scanner word = new Scanner(Bible);
word.useDelimiter("\\p{Punct} \\p{Space}");
提供如下文本文件中显示的输出

这个

青蛙

冉冉

快,快,快

远,远,远,远


如果
useDelimiter
应该考虑标点符号、新行等,为什么输出会有这样的差异?可能很简单,但还是第一次尝试一个程序。提前谢谢你的建议

使用
word.useDelimiter(“\\p{Punct}\\p{Space}”)
实际上是在告诉扫描程序查找由标点符号字符后跟空格再后跟另一个空格字符组成的分隔符。您可能希望拥有其中一个(并且只有一个),这可以通过以下方式实现

word.useDelimiter("\\p{Punct}|\\p{Space}");
或者至少其中一个,看起来像

word.useDelimiter("[\\p{Punct}\\p{Space}]+");
更新 @Andrzej很好地回答了您代码注释中的问题(我已经忘记了),但是他遗漏了一个小细节,我想在这里直接展开

为什么n++和n+1会给出不同的结果

这显然与生产线有关

            n = n+1;
我的直觉是你尝试的替代方案是

            n = n++;
这确实给出了令人困惑的结果(即,
n
不是递增的最终结果)

原因是
n++
(后缀递增运算符的标准名称)递增
n
的值,但表达式的结果是
n
的原始值!所以正确的使用方法很简单

            n++;
其结果相当于
n=n+1


下面是希望能帮助您更好地理解这些运算符的工作原理的示例。

关于正则表达式,péter是正确的,您匹配的是一个非常特定的序列,而不是一类字符

我可以回答您的来源评论中的问题:

注意到hasNextLine和hasNextLine都在工作……为什么一个在另一个之上

Scanner
类被声明为实现
Iterator
(因此它可以用于任何需要提供字符串的任意对象的情况)。因此,由于
迭代器
接口声明了一个
hasNext
方法,扫描器需要使用完全相同的签名来实现它。另一方面,
hasNextLine
是扫描仪自行实现的一种方法

对于实现接口的类来说,同时声明“通用命名”接口方法和更特定于域的方法并不是完全不寻常的,这两种方法都做相同的事情。(例如,您可能希望将游戏客户端实现为一个
迭代器
——在这种情况下,您必须声明
hasNext
,但可能需要一个名为
isGameUnfinished
的方法,该方法执行的操作完全相同。)

也就是说,这两种方法并不相同<如果扫描仪有另一个标记要返回,则code>hasNext返回true;如果扫描仪有另一行输入要返回,则
hasNextLine
返回true

我预计,如果您在一个不以换行符结尾的文件上运行扫描器,并使用除一个令牌之外的所有令牌,
hasNext
将返回
true
,而
hasNextLine
将返回false。(如果文件以换行结束,那么这两种方法的行为将是相同的——因为如果且仅当并非所有行都已使用时,会有更多的令牌——但它们在技术上并不相同。)

为什么n++和n+1会给出不同的结果

这很简单

n+1
只返回一个大于当前值
n
的值。而
n++
将n设置为一个更大的值,然后返回该值

因此,如果
n
当前为4,则两个选项都将返回5;不同之处在于,如果调用
n+1
,则
n
的值仍然是4,但如果调用
n++
,则值将是5

通常,明智的做法是避免使用
++
运算符,除非它用作样板文件(例如在索引上的
循环中)。为了更清楚、明确地表达您的意图,多输入两三个字符,甚至一行,这是一个非常小的代价,几乎总是值得的。

请也发布输入(wordtest.txt的实际内容)。“n++将
n
设置为多出一个,然后返回该值”-否,其结果是原始值
n
。OTOH
++n
按照您所描述的做。
            n++;