Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,根据单词长度将常用英语单词数组拆分为单独的列表/数组_Java_Regex_Arrays_List - Fatal编程技术网

在Java中,根据单词长度将常用英语单词数组拆分为单独的列表/数组

在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

我试图根据文本文件搜索一组常用英语单词,查看其中是否包含特定单词。因为这个数组有>700000个单词,如果在数组中多次需要检查大约1000个单词,我认为根据长度将单词分隔成单独的数组或列表会更有效。有没有一种不使用开关或大量if语句的简单方法来实现这一点?像这样:

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);