使用Java中的大型文本文件

时间:2010-08-01 08:26:46

标签: java algorithm text

我的老师给了我一个英语词汇。

  

选择随机字母,说'a'   比如写一个字母表中的单词   'apple'用最后一个字'e'写一个   来自e的词,说大象现在来自't'   等等。不允许重复

列出500个单词。 将列表邮寄给老师。 :)

所以我不是自己做,而是在研究一个Java代码,它将为我完成我的功课。 代码似乎很简单。

算法的核心: 从字典中挑选一个满足要求的随机单词。使用RandomAccessFile搜索()。尝试将它放入带有排序的Set(可能是LinkedHashSet)

但问题是拥有30万多个肠衣的庞大字典。 :| 蛮力随机算法不会起作用。

什么是最好,最快捷,最有效的出路?

****更新:**现在我已经编写了代码及其工作原理。如何使其高效,以便选择常用词? 任何包含常见字列表的文本文件?? **

6 个答案:

答案 0 :(得分:4)

要么寻找允许您将压缩字典保存在内存中的数据结构,要么只是为您的进程提供更多内存。三十万字不是那么多。

答案 1 :(得分:1)

希望这不会破坏你的乐趣或其他东西,但如果我是你,我会采取这种方法..

伪java:

abstract class Word {
    String word;
    char last();
    char first();         
}

abstract class DynamicDictionary {
    Map<Character,Set<Word>> first_indexed;

    Word removeNext(Word word){
        Set<Word> candidates = first_indexed.get(word.last());
        return removeRandom(candidates);
    }

    /**
     * Remove a random word out from the entire dic.
     */
     Word removeRandom();

    /**
     * Remove and return a random word out from the set provided.
     */
     Word removeRandom(Set<Word> wordset);    
}

然后

Word primer = dynamicDictionary.removeRandom();
List<Word> list = new ArrayList<Word>(500);
list.add(primer);
for(int i=0, Word cur = primer;i<499;i++){
    cur = dynamicDictionary.removeNext(cur);
    list.add(cur);
}

注意:不打算将其视为实际的java代码,只是一种大致解释方法的方法(没有错误处理,如果它真的被使用,没有良好的类结构,没有包围等等)。

我是否应该遇到内存问题,也许我会这样做:

abstract class Word {
    int lineNumber;
    char last();
    char first();
}

如果这还不够,猜猜我会在文件上使用二进制搜索或将其放在数据库等中。

答案 2 :(得分:0)

我认为这样做的方法可能是使用TreeSet,然后放置所有字典然后使用方法subSet来检索所需字母开头的所有单词并随机执行子集。

但在我看来,由于数据量的原因,最好的方法是使用带有SQL请求的数据库而不是Java。

答案 3 :(得分:0)

如果我这样做:

class LoadWords {
  public static void main(String... args) {
    try {
      Scanner s = new Scanner(new File("/usr/share/dict/words"));
      ArrayList<String> ss = new ArrayList<String>();
      while (s.hasNextLine())
        ss.add(s.nextLine());
      System.out.format("Read %d words\n", ss.size());
    } catch (FileNotFoundException e) {
      e.printStackTrace(System.err);
    }
  }
}

我可以使用java -mx16m LoadWords运行它,它将Java堆大小限制为16 Mb,这对Java来说并不是那么多。我的/usr/share/dict/words文件中包含大约250,000个单词,因此它可能比您的小一些。

您需要使用与我使用的简单ArrayList<String>不同的数据结构。也许HashMap ArrayList<String> {{1}},以该词的起始字母为主,将是一个很好的首选。

答案 4 :(得分:0)

这是一些单词频率列表: http://www.robwaring.org/vocab/wordlists/vocfreq.html

此文本文件可从上述链接访问,包含最常用的前2000个单词: http://www.robwaring.org/vocab/wordlists/1-2000.txt

答案 5 :(得分:-1)

目标是增加您的英语词汇量 - 而不是增加您计算机的英语词汇量。

如果你没有分享这个目标,你为什么(或你的父母)支付学费?