我的问题是关于迭代和性能。让我们考虑以下情况:
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 ms
感谢。
答案 0 :(得分:2)
为什么不尝试(地图):
http://docs.oracle.com/javase/7/docs/api/java/util/Map.html
基本上它是 Hashmaps 的集合: http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
以下是一个例子:
Map<String, List<Car>> map = new HashMap<String, List<Car>>();
答案 1 :(得分:1)
这取决于为什么你在迭代。如果你确实需要访问每辆底层汽车,那么你真的没有选择。但是,如果您正在寻找String的特定匹配项,那么您可以考虑使用Map。
答案 2 :(得分:0)
如果要查找String,则应使用HashMap。否则,就我的想法而言,你无法避免这种类型的迭代。
答案 3 :(得分:0)
使用哈希集合:使用Object.hashCode()和Object.equals()来优化搜索的HashSet。怎么样?
您必须定义MyClass.hashCode()和equals()的实现。 hashCode()给出了对象的整数表示(你可以在这里做你想做的事情,但是以两个不同对象具有不同值的方式进行)
然后, HashSet会对你的结果做一个模数:如果HashSet大小为5000,它会做一个模5000,它会找到你的对象ex的索引:如果你的hashCode()返回10252,那么10252% 5000 = 252.并且您的对象将被放入索引为252的数组中。最后,当你问(我有一个“BMW x6”的实例时,你要求的对象将调用其hashCode()方法,它将再次返回10252.而HashSet只搜索它是否有252索引中的对象。
如果有两个对象给出相同的hashCode,那么它们将通过equals()方法进行比较。
我希望我的解释清楚。简而言之,实现hashCode和equals()并尝试优化hashCode()的实现,以便在填充HashSet时获得时间
你可能也会对HashMap感兴趣,它存储了键使用散列机制的键和值:所以你可以通过它的键找到一个对象