【问题标题】:Iterate through only part of a large list in java仅遍历java中大列表的一部分
【发布时间】:2016-08-18 00:38:10
【问题描述】:

我正在尝试用 Java 制作一个 Boggle 游戏,对于我的程序,一旦我将棋盘随机化,我就有一个方法可以遍历可能的组合并将每个组合与字典列表进行比较以检查它是否是一个有效的单词,如果是的话,我把它放在钥匙里。它工作正常,但是程序需要三到四分钟来生成密钥,这主要是由于字典的大小。我使用的那个有大约 19k 个单词,比较每个组合需要大量时间。这是我试图加快速度的部分代码:

if (str.length()>3&&!key.contains(str)&&prefixes.contains(str.substring(0,3))&&dictionary.contains(str)){
        key.add(str);
    }

其中str 是生成的组合。 prefixes 是我根据dictionary 生成的列表,如下所示:

public void buildPrefixes(){
    for (String word:dictionary){
        if(!prefixes.contains(word.substring(0,3))){
            prefixes.add(word.substring(0,3));
        }
    }       
}

它只是在字典中添加所有三个字母前缀,例如“abb”和“mar”,这样当str 像“xskfjh”一样乱码时,它不会被检查整个字典,只是prefixes这就像 1k 个单词。

我要做的是通过仅遍历字典中与str 具有相同首字母的单词来缩短时间,所以如果str 是“abbey”,那么它只会检查@ 987654331@ 反对以“a”而不是整个列表开头的单词,这将大大减少时间。甚至更好的是,它只检查str 与具有相同前缀的单词。我对 Java 很陌生,所以如果您的回答非常详细,我将不胜感激,谢谢!

【问题讨论】:

  • 看起来你可能想要使用 Map> 或类似的东西。这会将您的搜索分成 26 个块,并会在一定程度上加快搜索速度。但您可能正在寻找的是一种有效地构建和搜索图表的方法
  • 谷歌搜索时发现了这个...wutka.com/dawg.html有趣的东西
  • 你正在尝试重新发明 Trie
  • 为什么不使用简单的Set?我错过了什么吗?

标签: java performance arraylist


【解决方案1】:

cmets 想说的是 - 不要重新发明轮子。 Java 不是汇编程序或 C,它足够强大,可以处理这些琐碎的情况。 这是简单的代码,它表明简单的 Set 可以轻松处理您的词汇:

import java.util.Set;
import java.util.TreeSet;

public class Work {

    public static void main(String[] args) {
        long startTime=System.currentTimeMillis();
        Set<String> allWords=new TreeSet<String>();
        for (int i=0; i<20000;i++){
            allWords.add(getRandomWord());
        }
        System.out.println("Total words "+allWords.size()+" in "+(System.currentTimeMillis()-startTime)+" milliseconds");

    }

    static String getRandomWord() {
        int length=3+(int)(Math.random()*10);
        String r = "";
        for(int i = 0; i < length; i++) {
            r += (char)(Math.random() * 26 + 97);
        }
        return r;
    }
}

在我的电脑上显示

Total words 19875 in 47 milliseconds

如您所见,20,000 个单词中有 125 个是重复的。不仅需要时间以非常低效的方式生成 20,000 个单词,而且还要存储它们以及检查重复项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 2020-05-23
    相关资源
    最近更新 更多