读取文件并使用HashMap和HashSet吐出单词的计数

时间:2016-05-10 09:58:49

标签: java data-structures hashmap hashset

这是我使用HashMapHashSet编写代码的第一次经历,我有点困惑从哪里开始。我想读取一个文件并计算使用的字符串数量,但我必须使用HashMapHashSet来完成此操作。

关于从哪里开始的任何想法?

所以我会读取文件并将字符串放在一个数组中,然后从数组中读取它并将它们放入HashSet?这是一个愚蠢的想法吗?

约束是程序中唯一的O(n)操作应该遍历文本文件。

感谢您为增加我的知识所做的贡献;)

3 个答案:

答案 0 :(得分:0)

首先从文件中读取整个数据并存储在字符串对象中 现在使用java.util.StringTokenizer类.it将拆分令牌中的所有单词 现在逐个读取所有令牌并检查如下 在HashMap

中使用word作为Key及其频率作为值
HashMap map=new HashMap();
HashSet set=new HashSet();
StringTokenizer st = new StringTokenizer(strObj);
String s;
while (st.hasMoreTokens()) {
     s=st.nextToken();
    if(map.containsKey(s))
    {
        count=(Integer)map.get(s);
        count++;
        map.put(s,count);
        set.add(s);
    }
    else
    {
        map.put(s,count);
        set.add(s);
    }
}

答案 1 :(得分:0)

你很近,但可能错过中间人(那个阵列)。

您可以使用HashMap<String, Integer>将字符串映射存储为字符串计数 您的程序需要做的是:

  1. 从文件中读取下一个字符串。
  2. 检查HashMap中是否存在该字符串:
    1. 如果确实存在,只需抓住Integer从地图上映射到的String,将其递增,然后将其放回地图中。
    2. 如果不存在,请将String放入地图中Integer 1。
  3. 从步骤1开始重复,直到文件被读取。
  4. HashMap抓取价值集,并使用Collection<Integer> counts = map.values();
  5. 存储
  6. 使用流int sum = counts.stream().mapToInt(i -> i).sum();
  7. 对集合求和
  8. 输出sum
  9. 的值

    我相信你可以想出把它转换为代码自己! :)

    您可以在HashMap here上找到更多信息(请查看values()方法),有关Stream here的更多信息,以及有关该信息的更多信息来自第5步的here代码。

答案 2 :(得分:0)

除了Sharad的回答:从文件中读取......

// would loved to use Integer, but it is immutable...
class Wrapper
{
    public Wrapper(int value)
    {
        this.value = value;
    }
    public int value;
}

HashMap<String, Wrapper> counts = new HashMap<String, Wrapper>();
Scanner scanner = new Scanner(new File(fileName));
while(scanner.hasNext())
{
    String token = scanner.next();
    Wrapper count = counts.get(token);
    if(count == null)
    {
        counts.put(token, new Wrapper(1));
    }
    else
    {
        ++count.value;
    }
}
scanner.close();

我稍微改变了sharad的算法,如果该值已经在地图中,则不必计算两次哈希值,并且使用泛型可以使您不必进行强制转换。

如果您只需要设置文件中的字符串,则可以通过counts.keySet();获得。