首页 > 解决方案 > ArrayLists 更好的实践

问题描述

我用 Java 编写了 2 个方法。第二种方法对我来说看起来更干净,因为我来自 python 背景,但我认为它会比第一种慢,因为 indexOf() 也进行迭代?在这种情况下,有没有办法正确使用 for in 循环?另外,如果有更好的方法(没有 Streams),怎么做?

private ArrayList<MyObject> myObjects;

第一种方法:

private int findObject(String objectName) {
    for(int i=0; i<this.myObjects.size(); i++) {
        MyObject myObject = this.myObjects.get(i);
        if(myObject.getName().equals(objectName)) return i;
    }
    return -1;
}

第二种方法:

private int findObject(String objectName) {
    for(MyObject myObject: this.myObjects) {
        if(myObject.getName().equals(objectName)) return this.myObjects.indexOf(myObject);
    }
    return -1;
}

标签: javasearcharraylist

解决方案


我认为它会比第一个慢,因为 indexOf() 也进行迭代?

你是对的。

有没有办法for each在这种情况下正确使用循环?

您可以使用for eachAND 索引变量。

private int findObject(String objectName) {
    int i = 0;
    for (MyObject myObject: this.myObjects) {
        if (myObject.getName().equals(objectName)) return i;
        i++;
    }
    return -1;
}

myObjects.get(i)如果是昂贵的操作(例如在LinkedListwhere get(n)is 上O(N))或者如果它不可实现(例如,如果您正在迭代 a ),这将是一个很好的解决方案Stream

您还可以使用ListIterator 提供myObjects方法,该方法返回ListIterator; 有关示例,请参见@Andy Turner 的答案。(它不适用于典型SetMap班级。)


推荐阅读