Set.size () не соответствует количеству элементов в итераторе - PullRequest
1 голос
/ 26 июля 2010

Почему Set.size () не совпадает с количеством элементов в итераторе набора?

Я использую HashSet и добавил несколько повторяющихся значений.Эти дубликаты были автоматически удалены, так как я использовал набор.Set.size () возвращает 16. Когда я на самом деле перебираю элементы, я получаю 13.

Что может быть причиной этой разницы?Я правильно делаю?

Set set = new HashSet();
...
System.out.println ("Found " + set.size() + " tokens...");
Iterator it = set.iterator();
int i = 0;
while (it.hasNext()) {
    i++;
    System.out.println(Integer.toString(i) + ": " + (String)it.next());
}

Вот вывод с консоли:

Found 16 tokens...
1: 3 Months Free HD Extra Pack
2: Best Buy - $30 for 3 Months (Instant Rebate)
3: Gift Card - Fry's - $100 (HDTV Offer)
4: 6 Months FREE Showtime
5: 3 Months Free HD Access
6: Savings Certificate Booklet
7: 3 months FREE Showtime (rolls off month 4)
8: Free NASCAR Hotpass
9: 3 Months Free DVR Service
10: $0 Delivery & Handling
11: 1 Year Free Showtime
12: $99 Off Advance Equipment (2nd AP)
13: Best Buy - $30 for 12 Months (Instant Rebate)

Ответы [ 2 ]

3 голосов
/ 26 июля 2010

Серьезно, это невозможно. HashSet - это достаточно хорошо зарекомендовавший себя класс, поэтому вы не сможете обнаружить ошибку, описанную вами. Вот несколько способов сделать это:

  • Шуметь с набором, используя Reflection, как подсказывает Марк Петерс;
  • Вы вызвали исключение после 13-го элемента, который завершает программу
  • Переопределение поведения Set, чтобы сделать его несовместимым
  • Вы используете разные наборы для распечатки итогов и предметов
3 голосов
/ 26 июля 2010

Поскольку вы использовали отражение:

Set set = new HashSet();

Field size = HashMap.class.getDeclaredField("size");
size.setAccessible(true);
Field map = HashSet.class.getDeclaredField("map");
map.setAccessible(true);
size.set(map.get(set), 16);

System.out.println("Found " + set.size() + " tokens...");

Если серьезно, то я могу думать только так, что вы получите эти результаты, предполагая, что вы используете стандартный HashSet, а не какой-то сторонний. Теперь я не могу себе представить, что вы будете использовать рефлексию, чтобы сделать это, и все же не поймете свои результаты, поэтому я предполагаю, что вы ошибаетесь в том, что говорите нам (например, set на самом деле не локальный, но доступно из другой ветки).

...