当我尝试迭代时,我不断获取列表中的第一个对象。
代码:
@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次。 为什么它不会迭代到下一个对象?
答案 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
但是它被发现有意义相等(由String
类equals()
覆盖定义)与第一个索引中的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;
}