Не будет ли более эффективным подход назначить ссылку из Word на MyFile в тот момент, когда вы знаете, что Word находится в файле? То есть, как вы строите список слов в объекте MyFile? Если вы читаете слова в 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.
Изменено после добавления кода, который составляет список слов:
Хорошо, поэтому, увидев код, который строит ваши Слова, я не думаю, что установление отношений является источником вашей неэффективности. Похоже, что вы устанавливаете отношения точно так, как я предложил (добавляя каждое слово, вы присваиваете этому файлу идентификатор файла соответствующего файла).
Похоже, источником вашей неэффективности является то, что для каждого слова вы должны сопоставлять его с различными вещами, которые у вас есть в наборе файлов (например, WordToWordId). Таким образом, для каждого слова вам нужно пройтись по каждой строке этого файла и найти соответствие. Это, конечно, неэффективно.
Лучшим подходом является размещение этих пар в памяти в HashMap, инициализированных при запуске. Таким образом, если у вас есть определенное слово и вам нужен соответствующий идентификатор, или наоборот, вы ищите их в своей HashMap, которая является операцией постоянного времени. Точно так же для каждого слова вы просматриваете каждый файл; снова сделайте этот цикл ОДИН РАЗ и сохраните результат в HashMap. Тогда поиски становятся постоянными.