这是我使用的方法:
public void addSong(LibrarySong song){
//Check if doublicates exist
for(int i=0; i<intoPanel.getComponentCount(); i++){
if(song.getName().toLowerCase().equals(intoPanel.getComponent(i).getName().toLowerCase()))
return;
}
intoPanel.add(song);
}
....向JPanel插入一个新的组件。我通过检查名称是否已经存在来做到这一点。这很有效,但是当我需要D&amp; D或手动插入100.000项目然后运行得越来越慢
我的问题是:
我可以使用更好的东西更快地完成这个过程吗?谢谢......
修改: 在回答之后我将代码更改为:
String name;
public void addSong(LibrarySong song){
//Check if doublicates exist
name=song.getName().toLowerCase();
for(int i=0; i<intoPanel.getComponentCount(); i++){
if(name.equals(intoPanel.getComponent(i).getName().toLowerCase()))
return;
}
intoPanel.add(song);
}
答案 0 :(得分:5)
在循环前移动song.getName().toLowerCase()
以执行toLowerCase()
一次。
更新:Actualy添加10万个组件并不是一个好主意。使用例如JTable的JList来表示具有自定义CellRenderer的歌曲
答案 1 :(得分:1)
您可以编写已排序的链接列表来存储所有值。因为它是排序的,所以插入和搜索都将花费O(logN)时间,因为您可以使用二进制搜索。
看起来像很多工作,实际上HashMap或HashSet可能更好。
答案 2 :(得分:1)
首先,不要在用户界面中添加100,000个项目。对于可以添加到界面而不会混淆用户(最多几百)的用户界面项目数量,线性搜索的性能将绰绰有余。
如果您想存储超过几百首歌曲,则必须考虑数据结构和用户界面。
通过选择正确的数据结构和用户界面,您可以在性能和用户友好性方面获得更多收益。对于数据结构,您可以使用例如HashMap<String,LibrarySong>
。然后您可以使用以下代码:
if (!song.containsKey(song.getName().toLowerCase()) {
map.put(song.getName().toLowerCase(), song);
}
几乎在恒定的时间内运行。
对于用户界面,最好让用户输入名称,然后搜索数据结构中的相应歌曲。
您是否考虑过使用数据库进行数据存储?