java—读取一个文件并使用hashmap和hashset吐出字数

ki1q1bka  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(358)

这是我第一次使用 HashMap 以及 HashSet 我有点不知道从哪里开始。我想读取一个文件并计算使用的字符串数,但我必须使用 HashMap 以及 HashSet .
你知道从哪里开始吗?
因此,我将读取文件并将字符串放入数组中,然后从数组中读取并将它们放入 HashSet ? 这是个愚蠢的想法吗?
约束条件是 O(n) 程序中的操作应该是遍历文本文件。
感谢您为我增加知识所做的贡献;)

ltqd579y

ltqd579y1#

你很接近,但可能会错过中间人(数组)。
你可以使用 HashMap<String, Integer> 存储字符串Map到字符串计数。
你需要你的程序做的是:
从文件中读取下一个字符串。
检查您是否存在该字符串 HashMap :
如果它真的存在,就抓住它 Integer 那就是 String 从Map中Map到,增加它,然后将它放回Map中。
如果不存在,则将 String 在Map上 Integer 1.
从步骤1开始重复,直到文件被读取。
HashMap 并使用 Collection<Integer> counts = map.values(); 使用流对集合求和 int sum = counts.stream().mapToInt(i -> i).sum(); 输出的值 sum .
我相信你能想出把它转换成代码自己!:)
你可以找到更多关于 HashMap 这里(查看 values() 方法),有关 Stream 这里,还有更多关于第5步中的代码的信息。

ki0zmccv

ki0zmccv2#

首先从文件中读取整个数据并存储在string对象中,现在使用 java.util.StringTokenizer 类。它将拆分令牌中的所有单词,现在逐个读取所有令牌,并像下面一样检查它,使用单词作为键,使用频率作为值 HashMap ```
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);
}
}

bf1o4zei

bf1o4zei3#

除了沙拉德的回答:从文件中读取。。。

// 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的算法,如果hash值已经在Map中,就不必计算两次,使用泛型可以避免强制转换。
如果只需要设置文件中的字符串,可以通过 counts.keySet(); .

相关问题