【发布时间】:2014-01-29 15:04:43
【问题描述】:
我的问题是关于迭代和性能的。让我们考虑以下案例:
public class Car {
private String name;
private int type;
private int horsePower;
String getKey() {
return type + "_" + horsePower;
}
private final int NUM_OF_CARS = 50000;
public void test() {
List<Car> cars = new ArrayList<Car>(NUM_OF_CARS);
for (int i = 0; i < NUM_OF_CARS; i++) {
Car c = new Car();
if (i == 0 || i == 176 || i == 895 || i == 1500 || i == 4600) {
c.name = "Audi A4 " + i;
c.type = 1;
c.horsePower = 200;
} else {
c.name = "Default";
c.type = 2 + i;
c.horsePower = 201;
}
cars.add(c);
}
// Matches should contain all Audi's since they have same type and horse
// power
long time = SystemClock.currentThreadTimeMillis();
HashMap<String, List<Car>> map = new HashMap<String, List<Car>>();
for (Car c : cars) {
if (map.get(c.getKey()) != null) {
map.get(c.getKey()).add(c);
} else {
List<Car> list = new ArrayList<Car>();
list.add(c);
map.put(c.getKey(), list);
}
}
Iterator<Entry<String, List<Car>>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
if (iterator.next().getValue().size() == 1) {
iterator.remove();
}
}
Log.d("test", String.valueOf((SystemClock.currentThreadTimeMillis() - time)));
}
}
这是在这里找到所有奥迪的最有效方法吗?
这花了我 1700 毫秒
谢谢。
【问题讨论】:
-
为什么嵌套 for 循环是一件坏事?您是否分析并确定这部分程序是一个瓶颈?
-
集合应该是 ArrayList 还是其他一些可以接受的集合类/自定义集合?
-
它可以是 ArrayList 以外的东西,只需要保存所有的 Cars。
-
详细说明您的要求。你知道你想找到“奥迪” 1 型和 200 马力吗?然后你不需要循环内循环。或者你想找到所有类似的汽车?
-
所有具有相同类型和马力的汽车,在更新的测试代码中,所有匹配奥迪的都有不同的名称并且代码有效,但我不知道它是否是最快的实现。
标签: java performance arraylist