Mon projet actuel nous permet d'utiliser TreeSet et TreeMap en Java, avec un tableau d'entrée de 10514 éléments de morceau lus à partir d'un fichier texte. Chaque morceau contient des champs Artiste, Titre et Lyrique. Le but de ce projet est de mener des recherches rapides sur les paroles en utilisant des ensembles et des cartes.Comment puis-je optimiser ce code?
D'abord, j'itérer sur le tableau de morceau d'entrée, l'accès au champ de paroles et de créer un objet Scanner à itérer sur les mots lyriques en utilisant ce code: commonWords
est un TreeSet de mots qui ne doivent pas être les clés et lyricWords
est l'ensemble carte des mots aux chansons.
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();
}
}
Pour construire le songSet, j'utiliser ce code:
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);
}
Maintenant, puisque buildSongSet est appelée à l'intérieur d'une boucle, créant la carte en N^exécute 2 temps. Lorsque le tableau d'entrée est composé de 4 morceaux, les recherches sont très rapides, mais lorsque vous utilisez la totalité des 10514 éléments, il faut plus de 15 minutes pour construire la carte sur une machine cadencée à 2,4 GHz avec 6 Go de RAM. Que puis-je faire pour rendre ce code plus efficace? Malheureusement, la réduction des données d'entrée n'est pas une option.
Pourriez-vous inclure les définitions des commonWords et lyricWords –
de définitions ont été ajoutées. commonWords est un ensemble de mots qui ne doivent pas être des clés et lyricWords est la structure globale sur laquelle les recherches sont exécutées. – Jason