为什么 Iterators.size() 使迭代器为空?
Why Iterators.size() making the iterator empty?
public static void main(String args[]) throws JSONException {
JSONObject json = new JSONObject();
json.put("name", "abcgdj");
json.put("no", "1234");
json.put("contact", "6748356");
Iterator<?> keys = json.keys();
System.err.println(Iterators.size(keys));
System.err.println(Iterators.size(keys));
}
在这段代码中,在执行 Iterators.size(keys)
之后,迭代器变空,对于第二个 print 语句,它返回 0。
size()
方法在包com.google.common.collect.iterators
下。所以我看了Iterators.size()function.It的代码是,
public static int size(Iterator<?> iterator) {
long count = 0L;
while (iterator.hasNext()) {
iterator.next();
count++;
}
return Ints.saturatedCast(count);
}
所以我怀疑迭代器keys
是怎么变空的。是否引用调用?
谁能解释一下 size() 函数内部发生了什么
System.err.println(Iterators.size(keys));
As it says in the Javadoc,这耗尽了 keys
迭代器:它一直调用 next()
直到 hasNext()
为假。
那么在你调用之前它不会被重置
System.err.println(Iterators.size(keys));
再次(因为无法重置迭代器)。所以 hasNext()
立即 returns false,所以没有更多的元素可供它读取。因此大小为零。
您需要使用新的迭代器重新分配变量:
Iterator<?> keys = json.keys();
System.err.println(Iterators.size(keys));
keys = json.keys(); //
System.err.println(Iterators.size(keys));
或者不声明变量(因为它实际上 (*) 之后没用):
System.err.println(Iterators.size(json.keys()));
System.err.println(Iterators.size(json.keys()));
(*) 您可以使用它来删除迭代器的最后一个元素。
public static void main(String args[]) throws JSONException {
JSONObject json = new JSONObject();
json.put("name", "abcgdj");
json.put("no", "1234");
json.put("contact", "6748356");
Iterator<?> keys = json.keys();
System.err.println(Iterators.size(keys));
System.err.println(Iterators.size(keys));
}
在这段代码中,在执行 Iterators.size(keys)
之后,迭代器变空,对于第二个 print 语句,它返回 0。
size()
方法在包com.google.common.collect.iterators
下。所以我看了Iterators.size()function.It的代码是,
public static int size(Iterator<?> iterator) {
long count = 0L;
while (iterator.hasNext()) {
iterator.next();
count++;
}
return Ints.saturatedCast(count);
}
所以我怀疑迭代器keys
是怎么变空的。是否引用调用?
谁能解释一下 size() 函数内部发生了什么
System.err.println(Iterators.size(keys));
As it says in the Javadoc,这耗尽了 keys
迭代器:它一直调用 next()
直到 hasNext()
为假。
那么在你调用之前它不会被重置
System.err.println(Iterators.size(keys));
再次(因为无法重置迭代器)。所以 hasNext()
立即 returns false,所以没有更多的元素可供它读取。因此大小为零。
您需要使用新的迭代器重新分配变量:
Iterator<?> keys = json.keys();
System.err.println(Iterators.size(keys));
keys = json.keys(); //
System.err.println(Iterators.size(keys));
或者不声明变量(因为它实际上 (*) 之后没用):
System.err.println(Iterators.size(json.keys()));
System.err.println(Iterators.size(json.keys()));
(*) 您可以使用它来删除迭代器的最后一个元素。