在Java中处理大型文本文件

在Java中处理大型文本文件,java,algorithm,text,Java,Algorithm,Text,老师给我布置了一个英语词汇作业 选择一个随机字母表,说“a” 从字母表中写一个单词,比如 “苹果”用最后一个词“e”写一个 从e传来的话,现在说大象从't' 等等不许重复 列出500个单词。 把名单寄给老师。:) 因此,我不是自己做,而是在编写一个Java代码,它将为我做家庭作业。 代码似乎很简单 算法的核心是: 从字典中随机选取一个符合要求的单词。使用RandomAccessFile查找()。试着把它放在一个有序的集合中(可能是LinkedHashSet) 但问题在于词典的庞大规模,有30多万

老师给我布置了一个英语词汇作业

选择一个随机字母表,说“a” 从字母表中写一个单词,比如 “苹果”用最后一个词“e”写一个 从e传来的话,现在说大象从't' 等等不许重复

列出500个单词。 把名单寄给老师。:)

因此,我不是自己做,而是在编写一个Java代码,它将为我做家庭作业。 代码似乎很简单

算法的核心是: 从字典中随机选取一个符合要求的单词。使用RandomAccessFile查找()。试着把它放在一个有序的集合中(可能是LinkedHashSet)

但问题在于词典的庞大规模,有30多万个条目| 暴力随机算法不起作用

最好、最快、最有效的出路是什么

****更新:**现在我已经编写了代码及其工作原理。我怎样才能使它有效地选择常用词呢?
任何包含???**

周围常见单词列表的文本文件,要么寻找一种数据结构,允许您在内存中保存一个压缩字典,要么只是给您的进程更多内存。三十万个单词并不是那么多。

我认为一种方法是使用
树集
放置所有字典,然后使用方法
子集
检索以所需字母开头的所有单词,并对子集进行随机搜索


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

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

如果你不同意这个目标,为什么你(或你的父母)要支付学费?

如果我这样做:

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);
    }
  }
}
类装入词{
公共静态void main(字符串…参数){
试一试{
扫描器s=新扫描器(新文件(“/usr/share/dict/words”);
ArrayList ss=新的ArrayList();
而(s.hasNextLine())
ss.add(s.nextLine());
System.out.format(“读取%d个字,\n”,ss.size());
}catch(filenotfounde异常){
e、 printStackTrace(System.err);
}
}
}
我可以使用
java-mx16m LoadWords
运行它,这将java堆的大小限制为16MB,这对于java来说没有那么多内存。我的
/usr/share/dict/words
文件中大约有250000个单词,因此它可能比您的小一些


您需要使用与我使用的简单的
ArrayList
不同的数据结构。也许一个
ArrayList
HashMap
,键入单词的起始字母将是一个不错的开始选择。

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

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

如果这还不够,我想我会对文件使用二进制搜索,或者将其放入数据库等

以下是一些词频列表:

此文本文件可从上述链接访问,其中包含最常用的前2000个单词:

我非常清楚这一点。文本文件是4MB!4MB相当小,不是吗?对于文本文件来说,它很大,对吗|出于兴趣,目标是什么?要找到没有重复的最长单词序列?只需列出500个单词。完成作业:)并使用java字典容器(例如)hashmap将字典文件放入当然:p(我读它就像他总是从文件中查找一样)。到目前为止,我总是从文件中查找|@神话,不要-只要把它读入一个HashMap并使用它。这是一个常规的大学作业。我对我的英语很有信心。这很容易做到。为它编写代码将学到一些东西。:)这是一个愚蠢的作业,作弊不仅是被允许的,而且是被推荐的。我将返回一份500条亵渎的清单,只是为了说明我的观点。我同意Myth17,听起来像是在打盹。如果你对自己的英语有信心,为什么要上英语课?虽然我同意这是一项愚蠢的任务,但你为什么还被录取。为什么不找一份真正的工作或上一所像样的大学呢?如果你的老板(在一份真正的工作中)给了你这样一个愚蠢的任务,你至少会满足于领取工资而不是支付学费。我在大学时对我的英语也很有信心,但他们经常要求我们参加英语课!不管你的专业是什么。至少在日本。。
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);
}
abstract class Word {
    int lineNumber;
    char last();
    char first();
}