对数组中的单词进行排序

时间:2013-10-23 14:07:55

标签: java sorting

我正在开展一个项目,从文本文档中获取所有单词,计算它们出现的次数,按字母顺序排列并打印出来。我已完成所有这些步骤,但我的输出仍然存在一些问题 - 我需要从列表中删除重复的单词,而不是打印:

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”。

1 个答案:

答案 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

装置

  • s代替,s / 1/2意味着用1代替2
  • [开始一个角色类
  • 字符类中的
  • ^匹配与类
  • 相反的字符
  • \ w字母
  • \ s whitespace
  • ]字符类的结尾
  • 最后的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和其他语言也有正则表达式系统