2012-06-13 25 views
6

Tôi đã lột xuống mã để tái tạo một ví dụ mà ném lỗi:java TreeSet ném IllegalArgumentException: chìa khóa ra khỏi phạm vi

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

Mục đích của mã này là để thực hiện một số loại rollover khi lấy các tập con của bộ này. Ví dụ. trong trường hợp trên, tôi muốn tất cả các yếu tố từ c [exclusive] đến b [bao gồm]. Tôi nhận thấy rằng nếu tôi nhận xét ra các dòng tailSet() hoặc headSet(), phần còn lại của mã hoạt động tốt. Tuy nhiên, khi tôi có cả hai dòng, tôi nhận được

java.lang.IllegalArgumentException: key out of range

+0

Có thể bạn có thể lặp lại và thực hiện thủ công? – sp00m

+1

+1 cho một [SSCCE] tốt (http://sscce.org/) – adarshr

Trả lời

7

Hãy thử một cái gì đó như thế này:

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

Khi bạn làm

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

bạn thực sự mất tham chiếu đến mới TreeSet mà bạn đã tạo và nhận được SortedSet rằng trả lại set.tailSet.

+0

+1 cho "mất tham chiếu đến TreeSet mới ... nhận được SortedSet mà set.tailSet trả về". Không chắc tôi đã bỏ lỡ điều đó như thế nào. Tôi đã thực hiện vài bài kiểm tra để xác nhận rằng lỗi phát sinh bởi vì tôi đang cố gắng thêm các chuỗi <= "b" vào một tập hợp con chỉ chứa các chuỗi> "c". Đã lưu một dòng bằng cách sử dụng NavigableSet set2 = new TreeSet (set.tailSet ("c", false)); Cảm ơn! – Kes115

+0

Bạn được chào đón! – tibtof