2012-06-13 35 views
6

mam okrojona kod odtworzyć przykład, który zgłasza błąd:java TreeSet rzucanie IllegalArgumentException: klucz z zakresu

public class Test { 
    public static void main(String[] args) { 
    NavigableSet<String> set = new TreeSet<String>(
      Arrays.asList("a", "b", "c", "d")); 
    NavigableSet<String> set2 = new TreeSet<String>(); 
    set2 = set.tailSet("c", false); 
    set2.addAll(set.headSet("b", true)); 
    System.out.println(set2); 
    } 
} 

Celem kodeksu jest wdrożenie jakiegoś najazdu przy pobieraniu podzbiory zestawu. Na przykład. w powyższym przypadku chcę, aby wszystkie elementy od c [exclusive] do b [włącznie]. Zauważyłem, że jeśli skomentuję linie tailSet() lub headSet(), reszta kodu działa dobrze. Jednak kiedy mam obie linie, mam

java.lang.IllegalArgumentException: key out of range

+0

Może możesz iterować na nim i robić to ręcznie? – sp00m

+1

+1 za dobry [SSCCE] (http://sscce.org/) – adarshr

Odpowiedz

7

spróbować czegoś takiego:

public static void main(String[] args) { 
     NavigableSet<String> set = new TreeSet<String>(
       Arrays.asList("a", "b", "c", "d")); 
     NavigableSet<String> set2 = new TreeSet<String>(); 
     set2.addAll(set.tailSet("c", false)); 
     set2.addAll(set.headSet("b", true)); 
     System.out.println(set2); 
    } 

Kiedy robisz

set2 = set.tailSet("c", false); 

rzeczywiście tracą odniesienie do nowego TreeSet że utworzony i otrzymany zwrot .

+0

+1 za "utracono odniesienie do nowego zestawu drzewiastego ... pobierz SortedSet, który ustawił .tailSet zwraca". Nie wiem, jak to przegapiłem. Zrobiłem kilka testów, aby potwierdzić, że błąd powstaje, ponieważ próbuję dodać ciągi, które są <= "b" do podzbioru, który powinien zawierać tylko ciągi> "c". Zapisano jedną linię za pomocą NavigableSet set2 = new TreeSet (set.tailSet ("c", false)); Dzięki! – Kes115

+0

Nie ma za co! – tibtof