我正在开展一个项目,从文本文档中获取所有单词,计算它们出现的次数,按字母顺序排列并打印出来。我已完成所有这些步骤,但我的输出仍然存在一些问题 - 我需要从列表中删除重复的单词,而不是打印:
Hello-3
Hello-2
Hello-1
Hi-2
Hi-1
像现在一样它只会打印:
Hello-3
Hi-2
- 我要做的第二件事是从文本中删除所有数字和标点符号: 如果输入为:
This3
test
is
a
2nd!
Test.
Te
st
然后我们会计算一次“this
”,一次出现“is
”,一次出现“a
”,出现一次“nd
” ,2次出现“test
”,出现一次“te
”,出现一次“st
”。
答案 0 :(得分:1)
使用哈希表将单词存储为键,将计数存储为值
散列表(在其他语言中称为关联数组或dict)只允许使用唯一键
这个perl one liner演示了这个概念
perl -n -e '$a{$_}++ for(split(/\s+/)); END { use Data::Dumper; print Dumper(\%a);}' corpus.txt
这是python中的同类事情
counter = dict()
for line in open("corpus.txt").readlines():
for word in line.split(" "):
v = counter.get(word, 0)
counter[word] = v + 1
for word in sorted(counter.keys()):
print "%d \t %s" % (counter[word], word)
你刚刚编辑了你的问题,说它是用java编写的。在java中,有HashMap类型 你可以使用,这是一个示例声明
HashMap<String, Integer> lookup = new HashMap<Character, Integer>();
至于问题的第二部分,正则表达式可能有用 - 尽管删除一些你所描述的字符实际上非常复杂。
像这样的正则表达式替换
s/[^\w\s]//g
装置
所以匹配任何不是空格或字母的东西,并替换为空,即删除它
用于上面的perl one liner
perl -n -e 's/[^\w\s]//g; $a{$_}++ for(split(/\s+/)); END { use Data::Dumper; print Dumper(\%a);}' corpus.txt
python,java和其他语言也有正则表达式系统