Почему Iterators.size () делает итератор пустым? - PullRequest
0 голосов
/ 18 сентября 2018
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) итератор становится пустым и для второго оператора печати возвращает 0.

Метод size() находится в пакете com.google.common.collect.iterators. Итак, я посмотрел код функции Iterators.size (). Это было,

 public static int size(Iterator<?> iterator) {
    long count = 0L;
    while (iterator.hasNext()) {
    iterator.next();
    count++;
  }
  return Ints.saturatedCast(count);
}

Так что я сомневаюсь, что итератор keys станет пустым. вызывается ли это по ссылке?

Может кто-нибудь объяснить, что происходит внутри функции size ()

1 Ответ

0 голосов
/ 18 сентября 2018
System.err.println(Iterators.size(keys));

Как сказано в Javadoc , это исчерпывает итератор keys: он просто продолжает вызывать next(), пока hasNext() не станет ложным.

Тогда это несброс, прежде чем снова вызвать

System.err.println(Iterators.size(keys));

(потому что нет способа сбросить итератор).Так что hasNext() немедленно возвращает 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()));    

(*) Вы можете использовать его для удаления последнего элемента итератора.

...