迭代列表时始终索引0

时间:2014-05-30 18:59:42

标签: java list

当我尝试迭代时,我不断获取列表中的第一个对象。

代码:

@Override
        protected void onPostExecute(List<Location> locations) {
            // TODO Auto-generated method stub
            super.onPostExecute(locations);

            Log.d("Debug" , "List: " + locations.size() +  " markers");
            for (Location location : locations) {
                Log.d("Debug", "index of: " + locations.indexOf(location));
            }
        }

打印说,列表中的200个标记和索引的打印输出给出“0”200次。 为什么它不会迭代到下一个对象?

4 个答案:

答案 0 :(得分:2)

正确迭代到下一个对象:

.indexOf()只考虑每个索引的每个对象.equals(location) == true到索引为0的第一个。

证明:

如果您添加了相同的Location 200次且.equals()未被正确覆盖;例如,每个实例都等于每个其他实例;你回来了第一场比赛。

List.indexOf(Object o) Javadoc明确指出:

  

返回指定元素第一次出现的索引   此列表,如果此列表不包含该元素,则为-1。更多   正式地,返回最低索引i,如果没有这样的索引,则返回(o==null ? get(i)==null : o.equals(get(i)))-1

如果.equals()认为是,那么您将获得第一场比赛。

在您的案例索引0

   public static void main(final String[] args)
    {
        final List<String> al = new ArrayList<String>(100);
        for (int i=0; i<100; i++) { al.add("Hello World!"); }
        for (final String s : al)
        {
            System.out.println(al.indexOf(s));
        }
    }

打印0 100次。

一个简单的改变

    for (int i=0; i<100; i++) { al.add(Integer.toString(i)); }

您会看到代码按正确实现的.equals()

所考虑的唯一对象按预期工作

答案 1 :(得分:1)

可能是因为indexOf()返回了一个对象实例的第一个索引equals()您正在检查的对象,并且您必须拥有许多被认为有意义相等的多个Location。这可能是因为您错误地覆盖了Location的equals方法,或者没有考虑特定覆盖的含义。

查看以下示例,该示例演示了除String个对象之外的问题;

        ArrayList<String> als = new ArrayList<String>();
        als.add("a");
        als.add("b");
        als.add("c");
        als.add("d");
        als.add("e");

        for(String s : als) System.out.print(als.indexOf(s));

        als = new ArrayList<String>();
        als.add(new String("a"));
        als.add(new String("a"));
        als.add(new String("a"));
        als.add(new String("a"));
        als.add(new String("a"));
        System.out.println();
        for(String s : als) System.out.print(als.indexOf(s));

输出;

01234
00000

在最后5个输出的0中,您检查数组的s String可能是数组中的第二个或更大String但是它被发现有意义相等(由Stringequals()覆盖定义)与第一个索引中的String相等,因此它将始终返回0 。请尝试使用对象数组的上述示例,除非它们在内存中引用相同的对象,否则它们永远不会被视为相等。

答案 2 :(得分:0)

通常for (Location location : locations)遍历位置列表中的对象。当调用indexOf()时,使用equals和hashCode来查找特定对象,但我认为你没有实现equals类Location的hashCode方法。尝试实现它们并检查。

答案 3 :(得分:0)

验证 等于方法 或验证实例 不为空 。这是ArrayList上方法的实现,以便了解原因。

public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = 0; i < size; i++)
            if (o.equals(elementData[i]))
                return i;
    }
    return -1;
}