这是我使用HashMap
和HashSet
编写代码的第一次经历,我有点困惑从哪里开始。我想读取一个文件并计算使用的字符串数量,但我必须使用HashMap
和HashSet
来完成此操作。
关于从哪里开始的任何想法?
所以我会读取文件并将字符串放在一个数组中,然后从数组中读取它并将它们放入HashSet
?这是一个愚蠢的想法吗?
约束是程序中唯一的O(n)
操作应该遍历文本文件。
感谢您为增加我的知识所做的贡献;)
答案 0 :(得分:0)
首先从文件中读取整个数据并存储在字符串对象中
现在使用java.util.StringTokenizer
类.it将拆分令牌中的所有单词
现在逐个读取所有令牌并检查如下
在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);
}
}
答案 1 :(得分:0)
你很近,但可能错过中间人(那个阵列)。
您可以使用HashMap<String, Integer>
将字符串映射存储为字符串计数
您的程序需要做的是:
HashMap
中是否存在该字符串:
Integer
从地图上映射到的String
,将其递增,然后将其放回地图中。String
放入地图中Integer
1。HashMap
抓取价值集,并使用Collection<Integer> counts = map.values();
int sum = counts.stream().mapToInt(i -> i).sum();
sum
。我相信你可以想出把它转换为代码自己! :)
您可以在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();
获得。