是一个代码片段,它返回一个类的对象。现在,该对象基本上与循环中的某些参数进行比较。
我担心的是如果循环中有数千个对象,那么性能和可伸缩性可能是个问题。请建议如何改进性能部分的代码
public Widget get(String name,int major,int minor,boolean exact) {
Widget widgetToReturn = null;
if(exact) {
Widget w = new Widget(name, major, minor);
// for loop using JDK 1.5 version
for(Widget wid : set) {
if((w.getName().equals(wid.getName())) && (wid.getVersion()).equals(w.getVersion())) {
widgetToReturn = w;
break;
}
}
} else {
Widget w = new Widget(name, major, minor);
WidgetVersion widgetVersion = new WidgetVersion(major, minor);
// for loop using JDK 1.5 version
for(Widget wid : set) {
WidgetVersion wv = wid.getVersion();
if((w.getName().equals(wid.getName())) && major == wv.getMajor() && WidgetVersion.isCompatibleAndNewer(wv, widgetVersion)) {
widgetToReturn = wid;
} else if((w.getName().equals(wid.getName())) && wv.equals(widgetVersion.getMajor(), widgetVersion.getMinor())) {
widgetToReturn = w;
}
}
}
return widgetToReturn;
}
答案 0 :(得分:4)
我认为Will的问题是第一个要问的问题 - 你为什么要在一个无效的数据结构中持有Widgets?
如果你使用这样的结构:
Map<String, Map<WidgetVersion,Widget>> widgetMap;
您可以编写以下代码:
public Widget get(String name,int major,int minor,boolean exact)
{
Widget widgetToReturn = null;
Map<WidgetVersion,Widget> widgetVersionMap = widgetMap.get(name);
WidgetVersion widgetVersion = new WidgetVersion(major, minor);
widgetToReturn = widgetVersionMap.get(widgetVersion);
if(widgetToReturn==null && exact==false)
{
// for loop using JDK 1.5 version
for(Entry<WidgetVersion,Widget> entry : widgetVersionMap.entrySet())
{
WidgetVersion wv = entry.getKey();
if(major == wv.getMajor() && WidgetVersion.isCompatibleAndNewer(wv, widgetVersion))
{
widgetToReturn = entry.getValue();
}
}
}
return widgetToReturn;
}
对于精确搜索,您有O(1)搜索时间,而对于非精确搜索,您有O(K),其中K是窗口小部件的版本数。
答案 1 :(得分:2)
您可能需要维护Map<WidgetVersion, Widget>
,而不是简单的“小工具集”。与当前版本的O(1)
查找相比,这将为您提供O(logN)
(对于哈希映射)或O(N)
(对于树图)查找。
(你可能实际上需要两张地图,或一张地图&gt;甚至更复杂的东西。我无法弄清楚你的确切/不精确匹配应该做什么,而且还取决于给定小部件的版本数量是多少可能在实践中。)
此外,你的“确切”案例的逻辑看起来很破碎。您正在创建一个窗口小部件,查看现有窗口小部件集,然后:
null
。答案 2 :(得分:1)
这些小部件不在名称中的地图中......为什么?
Map<String, List<Widget>> widgetMap;