0

我有以下代码,请记住我刚刚开始学习一门语言,并且一直在寻找相当简单的练习。欢迎编码礼仪和批评。

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()我会根据我拥有的文件获得所需的输出:

Far = 2, ran = 4, Frog = 2, Far = 7, fast = 1, etc...

插入useDelimiter方法如下

Scanner word = new Scanner(Bible);
word.useDelimiter("\\p{Punct} \\p{Space}");

提供以下输出,如下所示的文本文件中所示。

青蛙青蛙

跑了

跑跑跑

快,快,快

很远很远很远很远很远很远

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

4

2 回答 2

2

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

这是一个带有代码示例的线程,希望能帮助您更好地理解这些运算符的工作原理。

于 2012-05-09T11:46:14.497 回答
0

Péter 对正则表达式的看法是正确的,您匹配的是一个非常具体的序列,而不是一类字符。

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

注意到 hasNextLine 和 hasNext 都可以工作......为什么一个在另一个之上?

该类Scanner被声明为实现Iterator<String>(以便它可以在任何需要提供字符串的任意事物的情况下使用)。因此,由于Iterator接口声明了一个hasNext方法,所以 Scanner 需要使用完全相同的签名来实现它。另一方面,hasNextLine是 Scanner 自行实施的一种方法。

实现接口的类同时声明“通用命名”接口方法和更特定于域的方法并不完全不寻常,它们都做同样的事情。(例如,您可能希望将玩游戏的客户端实现为Iterator<GameCommand>- 在这种情况下,您必须声明hasNext,但可能希望有一个调用的方法isGameUnfinished执行完全相同的操作。)

也就是说,这两种方法并不相同。 hasNext如果扫描仪有另一个令牌要返回,则hasNextLine返回 true,而如果扫描仪有另一行输入要返回,则返回 true。

我希望如果您在一个不以换行符结尾的文件上运行扫描程序,并使用除一个标记之外的所有标记,那么hasNext将返回truehasNextLine将返回 false。(如果文件以换行符结尾,那么这两种方法的行为将相同 - 因为当且仅当并非所有行都已被消耗时才会有更多标记 - 但它们在技术上并不相同。)

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

这很简单。

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

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

一般来说,避免使用++操作符是明智的,除非在它被用作样板的情况下(例如在for索引上的循环中)。多花两三个字符,甚至多行一行,来更清楚、更明确地表达你的意图,这是一个很小的代价,几乎总是值得做的。

于 2012-05-09T11:58:44.037 回答