Java迭代,用于ArrayList中可能的匹配

时间:2014-01-29 15:04:43

标签: java performance arraylist

我的问题是关于迭代和性能。让我们考虑以下情况:

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

感谢。

4 个答案:

答案 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感兴趣,它存储了键使用散列机制的键和值:所以你可以通过它的键找到一个对象