2012-06-13 33 views
6

我已經剝離下來的代碼重現其引發錯誤的示例:的java TreeSet中投擲拋出:IllegalArgumentException:鍵超出範圍

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); 
    } 
} 

代碼的目的是檢索的子集時,以實現某種側翻的集合。例如。在上面的例子中,我想要從c [exclusive]到b [inclusive]的所有元素。我注意到,如果我註釋掉tailSet()或headSet()行,其餘代碼運行良好。然而,當我有兩條線,我得到

java.lang.IllegalArgumentException: key out of range

+0

也許你可以迭代它並手動執行它? – sp00m

+1

+1對於一個好的[SSCCE](http://sscce.org/) – adarshr

回答

7

嘗試這樣:

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); 
    } 

當你

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

你真正失去了參照新TreeSet你創建並獲得SortedSetset.tailSet返回。

+0

+1「丟失對新TreeSet的引用...獲取SortedSet set.tailSet返回」。不知道我是如何錯過的。我已經做了一些測試來確認錯誤的出現,因爲我試圖將<=「b」的字符串添加到只包含字符串>「c」的子集。通過使用NavigableSet保存一行 set2 = new TreeSet (set.tailSet(「c」,false));謝謝! – Kes115

+0

不客氣! – tibtof

相關問題