在Java中,根据单词长度将常用英语单词数组拆分为单独的列表/数组
我试图根据文本文件搜索一组常用英语单词,查看其中是否包含特定单词。因为这个数组有>700000个单词,如果在数组中多次需要检查大约1000个单词,我认为根据长度将单词分隔成单独的数组或列表会更有效。有没有一种不使用开关或大量if语句的简单方法来实现这一点?像这样:在Java中,根据单词长度将常用英语单词数组拆分为单独的列表/数组,java,regex,arrays,list,Java,Regex,Arrays,List,我试图根据文本文件搜索一组常用英语单词,查看其中是否包含特定单词。因为这个数组有>700000个单词,如果在数组中多次需要检查大约1000个单词,我认为根据长度将单词分隔成单独的数组或列表会更有效。有没有一种不使用开关或大量if语句的简单方法来实现这一点?像这样: for(int i = 0; i < commonWordArray.length; i++) { if(commonWordArray[i].length == 2) { twoLetterList.a
for(int i = 0; i < commonWordArray.length; i++) {
if(commonWordArray[i].length == 2) {
twoLetterList.add(commonWordArray[i]);
else if(commonWordArray[i].length == 3) {
threeLetterList.add(commonWordArray[i]);
else if(commonWordArray[i].length == 4) {
fourLetterList.add(commonWordArray[i]);
}
...etc
}
for(int i=0;i
然后在检查单词时执行相同的操作:
for(int i = 0; i < checkWords.length; i++) {
if(checkWords[i].length == 2) {
if(twoLetterList.contains(checkWords[i])) {
...etc
}
for(int i=0;i
使用列表集合
。也就是说,给定一个字符串单词
,首先找到合适的集合(set set set=set.get(word.length)
)-如果需要,创建集合,如果需要,扩展列表。然后只需执行set.add(word)
。完成
编辑/提示:一个(好的)程序员应该是懒惰的-如果你需要做/写两次同样的事情,你就做错了。假设你有内存(这是你目前的方法所依赖的),为什么不只是一个
集呢?更简单、更快。步骤1
创建单词桶
ArrayList<ArrayList<String>> buckets = new ArrayList<>();
for(int i = 0; i < maxWordLength; i++) {
buckets.add(new ArrayList<String>());
}
这种方法的缺点是,您的一些存储桶可能会被闲置。如果您只筛选常用的英语单词,这不是问题,因为它们的长度不超过30个字符。创建10-15个额外列表对于计算机来说是一个微不足道的开销。最大的不常用但非技术性的单词是183个字符。技术工作ds超过180000个字符,到那时这种方法显然不实用
这种方法的优点是ArrayList.get()
和ArrayList.add()
都以恒定的(O(1))时间运行。如果要使用多个字符串进行搜索,可以尝试类似算法的方法
或者,您可能希望扭转问题,检查700k数组中的字符串是否在1k数组中。为此,您将不会出现内存问题(imho),您可以使用简单的字典(平衡树)来解决。因此,您将使用700k log2(1000).使用a,这是一种内存高效的存储机制,它擅长存储单词并检查单词是否存在
自己实现一个是一个有趣的练习,或者看看现有的实现。因为在内存中存储大数组可能是一个杀手,而对文件的constatn访问可能会减慢您的速度,所以为什么不想将单词存储在数据库中(即H2)然后运行简单查询?Java支持哈希或关联数组吗?如果是这样,为什么不创建一个单词的键哈希,使其易于查找。或者,您是否允许特定单词的子字符串?@user902383我同意这是一个更好的方法,但这是我的研究论文中的一个简单密码分析工具,其中常见单词文件c一个参数不能作为参数传递
buckets.get(word.length()).add(word);