Похоже, ваш buildSongSet выполняет избыточную работу.Ваш блок:
if (lyricWords.containsKey(word)) {
addToSet= lyricWords.get(word);
addToSet.add(song);
word=readIn.next();
}
добавляет песню в существующий набор.Поэтому, когда вы найдете слово, о котором не знаете, просто добавьте к нему одну песню.Измените buildSongSet на:
public void buildSongSet(String word, Song firstSongWithWord) {
TreeSet<Song> songSet= new TreeSet<Song>();
songSet.add(firstSongWithWord);
lyricWords.put(word, songSet);
System.out.println("Word added "+word);
}
. Остальные песни, оставленные для повторения, будут добавлены в этот набор песен из первого блока кода, если они содержат это слово.Я думаю, что это должно сработать.
РЕДАКТИРОВАТЬ только что увидел, что это домашнее задание ... поэтому удалил рекомендации HashSet ..
Хорошо .. так что предположим, что у вас есть эти песни впорядок с текстами:
- Песня 1 - foo
- Песня 2 - foo bar
- Песня 3 - foo bar baz
Песня1 будет видно, что foo не содержит lyricWords, поэтому он вызовет buildSongSet и создаст набор для foo.Он добавится в набор, содержащий foo.
Song 2 увидит, что foo находится в lyricWords, и добавит себя в набор.Он увидит, что панель не входит в набор, и создаст набор и добавит себя.Ему не нужно проходить предыдущие песни, так как в первый раз слово было найдено в Песне 2.
Песня 3 следует той же логике.
Еще одна вещь, которую вы можете попробовать сделать, чтобы оптимизировать свойКод должен найти способ не обрабатывать повторяющиеся слова в тексте.если ваша лирика foo foo foo foo bar bar bar foo bar, то вы будете делать много ненужных проверок.
EDIT также см. ответ rsp - есть дополнительные ускорения, но большое ускорение избавляет от внутреннего цикла - рад, что теперь он сокращен до 15 секунд.