TreeSet<Integer> set = new TreeSet<Integer>(); TreeSet<Integer> subSet = new TreeSet<Integer>(); for(int i=606;i<613;i++){ if(i%2==0){ set.add(i); } } subSet = (TreeSet)set.subSet(608,true,611,true); set.add(609); System.out.println(set+" "+subSet);
TreeSet<Integer> set = new TreeSet<Integer>(); TreeSet<Integer> subSet = new TreeSet<Integer>(); for(int i=606;i<613;i++){ if(i%2==0){ set.add(i); } } subSet = (TreeSet)set.subSet(608,true,611,true); set.add(609); System.out.println(set+" "+subSet);
编译失败
发生运行时异常
[606, 608, 609,610, 612] [608, 609,610]
[606, 608, 609,610, 612] [608, 610]
TreeSet<Integer> set = new TreeSet<Integer>(); TreeSet<Integer> subSet = new TreeSet<Integer>(); for(int i=606;i<613;i++){ if(i%2==0){ if(i%2==0){ set.add(i); } } subSet = (TreeSet)set.subSet(608,true,611,true); //此时的subSet的值为[606,608,610,612] set.add(629); System.out.println(set+" "+subSet);
subset方法是求set的范围内的子集,两个true是表示是否包含端点(608和611),故subSet的值为[608,610]
1、TreeSet 自然排序
本题中,为了便于理解,我将集合set用ts替换,集合subSet用ts2代替
TreeSet ts = new TreeSet(); TreeSet ts2 = new TreeSet(); for(int i=606;i<613;i++){ if(i%2==0){ ts.add(i); } } //true表示包含边界值(608和611),同样false表示不包含 ts2 = (TreeSet)ts.subSet(608,true,611,true); //609在608和611之间,所以可以同时添加到ts和ts2中 //ts.add(609); //输出结果ts=[606, 608, 609,610, 612],ts2=[608, 609 , 610] //700不在608和611之间,所以不能添加到ts2中,但可以添加到ts中 //ts.add(700); //输出结果ts=[606, 608, 610, 612,700],ts2=[608, 610] //609在608和611之间,所以可以同时添加到ts和ts2中 ts2.add(609); //输出结果ts=[606, 608, 610, 609, 612],ts2=[608, 609, 610] //700不在608和611之间,所以通过ts2添加时会报错 //ts2.add(609); //IllegalArgumentException: key out of range System.out.println(ts+" "+ts2);
总结:
若n是一个集合,m是通过n通过subSet()方法得到的集合,m在添加元素时:
private transient NavigableMap<E,Object> m; TreeSet(NavigableMap<E,Object> m) { this.m = m; } public NavigableSet subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) { return new TreeSet(m.subMap(fromElement, fromInclusive, toElement, toInclusive)); }
返回集合中元素范围从fromElement到toElement的部分的视图。如果fromElement和toElement相等,则返回的集合为空,除非fromInclusive和toInclusive都为真。返回的集合与原集合相映射,因此返回集合中的更改将反映在该集合中,反之亦然。返回的集合支持该集合支持的所有原集合的操作。