gpt4 book ai didi

java - Java中高效的多对多关系

转载 作者:行者123 更新时间:2023-11-30 05:13:39 24 4
gpt4 key购买 nike

如何建立从 fileIDWords 以及从 word 的高效多对多关系fileIDs 没有像 Java 中的 Postgres 这样的数据库工具?

我有以下类(class)。从 fileIDwords 的关系很便宜,但反之则不然,因为我需要三个 for 循环。

alt text http://img191.imageshack.us/img191/4077/oliorakenne1.png

我的解决方案显然效率不高。其他选项可能是创建一个额外的类,该类以 word 作为 ID,ArrayListfileID

回复JacobM的回答

MyFile 构造函数的相关部分是:

            /**
* Synopsis of data in wordToWordConutInFile.txt:
* fileID|wordID|wordCount
*
* Synopsis of the data in the file wordToWordID.txt:
* word|wordID
**/


/**
* Getting words by getting first wordIDs from wordToWordCountInFile.txt and then words in wordToWordID.txt.
*/
InputStream in2 = new FileInputStream("/home/dev/wordToWordCountInFile.txt");
BufferedReader fi2 = new BufferedReader(new InputStreamReader(in2));

ArrayList<Integer> wordIDs = new ArrayList<Integer>();
String line = null;
while ((line = fi2.readLine()) != null) {
if ((new Integer(line.split("|")[0]) == currentFileID)) {
wordIDs.add(new Integer(line.split("|")[6]));
}
}
in2.close();

// Getting now the words by wordIDs.
InputStream in3 = new FileInputStream("/home/dev/wordToWordID.txt");
BufferedReader fi3 = new BufferedReader(new InputStreamReader(in3));

line = null;
while ((line = fi3.readLine()) != null) {
for (Integer wordID : wordIDs) {
if (wordID == (new Integer(line.split("|")[1]))) {
this.words.add(new Word(new String(line.split("|")[0]), fileID));
break;
}
}
}
in3.close();

this.words.addAll(words);

Word的构造函数位于 the paste .

最佳答案

当您知道 Word 在文件中时,将 Word 的链接分配给 MyFile 不是更有效的方法吗?也就是说,如何在 MyFile 对象中构建 Words 列表?如果您从文件系统上的文件中读取单词到 MyFile 中,则在读取每个单词时,会将其 MyFile 分配给当前文件。

//within MyFile constructor or setter for Words
while (//there's another word to add) {
Word newWord = new Word(//read word from file);
words.add(newWord);
newWord.setMyFile(this);
}

这类似于管理双向父子关系的典型方式:

//in Parent
public void addChild(Child child) {
myChildren.add(child);
child.setParent(this);
}

如果您向我们展示如何构建 MyFile 对象可能会有所帮助。

添加构建单词列表的代码后进行编辑:

好的,看过构建 Words 的代码后,我不认为建立关系是导致效率低下的根源。看起来您正在完全按照我建议的方式建立关系(当您添加每个单词时,您为该单词提供相应文件的 fileID)。

看来您效率低下的根源在于,对于每个单词,您必须将其与一组文件中当前拥有的各种内容(例如 WordToWordId)进行匹配。因此,对于每个单词,您必须循环遍历该文件的每一行,并找到匹配项。这肯定是低效的。

更好的方法是将这些配对存储在内存中的 HashMap 中,并在启动时初始化。这样,如果您有一个特定的单词并且需要相应的 ID,反之亦然,您可以在 HashMap 中查找它们,这是一个恒定时间的操作。同样,对于每个单词,您都会循环遍历每个文件;再次循环一次,并将结果存储在 HashMap 中。然后查找就变成常数时间。

关于java - Java中高效的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2417687/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com