Home > Java Puzzle > The Joy of Sets

The Joy of Sets

W związku z niespodziewaną popularnością i bardzo gorącym przyjęciem nowego serwisu, postanowiłem – wyjątkowo – dodać kolejnego Puzzle’a, zanim poprzedni zostanie rozwiązany.

  • Co pojawi się na ekranie po uruchomieniu poniższego kodu?
import java.util.HashSet;
import java.util.Set;

public class ShortSet {

  public static void main(String[] args) {
    Set<Short> s = new HashSet<Short>();
    for (short i = 0; i < 100; i++) {
      s.add(i);
      s.remove(i - 1);
    }
    System.out.println(s.size());
  }
}


Odpowiedzi:
(a) 1
(b) 100
(c) zostanie rzucony wyjątek
(d) żadne z powyższych

  • Odpowiedź uzasadnij i wyjaśnij dlaczego tak to działa
  • Jak poprawić powyższy kod, aby zachowywał się zgodnie z intuicją

Autorami zagadki są Joshua Bloch i William Pugh

Kategorie:Java Puzzle Tagi:, , , , ,
  1. dembol
    4 marca, 2011 at 07:42 | #1

    Odpowiedź (b) 100

    Uzasadnienie:
    – wszelkie operacje arytmetyczne w Javie są wykonywane na int
    – operacja i – 1 w wyniku da int, mimo że zmienna i to short
    – kolekcje w Javie operują na obiektach, więc do metody remove() zostanie przekazany obiekt Integer, a nie Short (autoboxing). Do kolekcji będą dodawane obiekty Short (o wartości od 1 do 100) a usuwane będą obiekty Integer (od -1 do 99), których kolekcja nie posiada.

    Aby kod zachowywał się intuicyjnie należy zrzutować wynik operacji i – 1 na typ short

    public class ShortSet {
      public static void main(String[] args) {
        Set<Short> s = new HashSet<Short>();
        for (short i = 0; i < 100; i++) {
          s.add(i);
          s.remove((short) (i - 1));
        }
        System.out.println(s.size());
      }
    }
    
  1. Brak jeszcze trackbacków