私の現在のプロジェクトでは、テキスト ファイルから読み込まれた 10514 の Song 要素の入力配列を使用して、Java で TreeSet と TreeMap を使用しています。各曲には、アーティスト、タイトル、および歌詞のフィールドが含まれています。このプロジェクトの目的は、セットとマップを使用して歌詞を高速に検索することです。
まず、入力 Song 配列を繰り返し処理し、歌詞フィールドにアクセスして、次のコードを使用して歌詞の単語を繰り返し処理する Scanner オブジェクトを作成し commonWords
ますlyricWords
。
public void buildSongMap() {
for (Song song:songs) {
//method variables
String currentLyrics= song.getLyrics().toLowerCase();
TreeSet<Song> addToSet=null;
Scanner readIn= new Scanner(currentLyrics);
String word= readIn.next();
while (readIn.hasNext()) {
if (!commonWords.contains(word) && !word.equals("") && word.length()>1) {
if (lyricWords.containsKey(word)) {
addToSet= lyricWords.get(word);
addToSet.add(song);
word=readIn.next();
} else
buildSongSet(word);
} else
word= readIn.next();
}
}
songSet を構築するために、次のコードを使用します。
public void buildSongSet(String word) {
TreeSet<Song> songSet= new TreeSet<Song>();
for (Song song:songs) {
//adds song to set
if (song.getLyrics().contains(word)) {
songSet.add(song);
}
}
lyricWords.put(word, songSet);
System.out.println("Word added "+word);
}
ここで、buildSongSet はループ内から呼び出されるため、マップの作成は N^2 時間で実行されます。入力配列が 4 曲の場合、検索は非常に高速に実行されますが、10514 要素の配列全体を使用すると、6 GiB RAM を搭載した 2.4GHz マシンでマップを構築するのに 15 分以上かかる場合があります。このコードをより効率的にするにはどうすればよいですか? 残念ながら、入力データを減らすことはできません。