首页 > 试题广场 >

以下程序的运行结果是:( ) TreeSet&l...

[单选题]
以下程序的运行结果是:(    )
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]
没有一个说到点子上的,这个出题应该是考subSet是否指向原数据
,不过刚好测试用例出的不好。比如subList 得到的引用是指向原数据的,对subList修改会修改原List。
subSet也一样,和subList都是返回元数据结构的一个视图。
比如,最后添加的是609,不是629的话,结果是:
[606, 608, 609, 610, 612] [608, 609, 610]
编辑于 2020-09-01 08:28:03 回复(18)
没什么好说的,去翻了API=======subset(form,true,to,true)是Treeset的非静态方法,该方法返回从form元素到to元素的一个set集合,两个boolean类型是确认是否包含边境值用的。
发表于 2019-08-09 08:17:48 回复(5)
1. subSet是指向原数据的,原数据修改,subSet也跟着修改
2. subset(form,true,to,true)是Treeset的非静态方法,该方法返回从form元素到to元素的一个set集合,两个boolean类型是确认是否包含边境值用的。

编辑于 2022-02-10 16:01:19 回复(3)
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]

编辑于 2019-07-21 14:24:16 回复(3)
本题主要考查:

1、TreeSet 自然排序

2、subSet()方法的运用
subset(form,true,to,true)中的from和to是范围这个范围中的集合,true只返回的集合中是包含上限和下限的。当试图插入一个元素以外的范围,返回的集合将抛出IllegalArgumentException。
不清楚的这里有篇博客讲的比较清楚:https://blog.csdn.net/yingpaixiaochuan/article/details/49019131
发表于 2019-11-08 11:02:53 回复(2)
有两个Treeset集合 set 和subSet,set里面有[606,608,610,612],subSet是在set里面的从608到611的集合,subSet 方法是返回一个视图的一部分从fromElement到toElement这个集合的元素。如果fromElement 和toElement是相等的,返回的集合是空的,除非fromInclusive和toInclusive都是true。返回的集合是由这个集合backed的,所以返回的变化反映在这个集合,反之亦然。返回的集合支持支持原集合所有可选的设置操作。因为没有611,所以是[608,610],然后再向 set 中添加一个629,因不是往subSet中添加,故不会报IllegalArgumentException。最终 set 就是 [608, 610, 612, 629], subSet就是 [608, 610]。
发表于 2019-08-31 10:04:37 回复(3)
subset方法是求范围内的子集
发表于 2019-06-25 20:23:09 回复(0)

本题中,为了便于理解,我将集合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在添加元素时:

  1. 通过n添加x元素,x可以是任意值
    • x 在 n 的范围内,n 和 m 都会添加x
    • x 不在 n 的范围内,只能 n 添加x, m 则不添加x
  2. 通过m自身添加x元素,x只能取值在n范围内
    否则,会报错(IllegalArgumentException: key out of range)
发表于 2021-10-14 11:51:10 回复(2)
这题有点东西, 关键在于为什么set调用add方法后,会影响到subSet的值!
subSet集合如果add的值的范围在subSet方法的from-to范围内,那么set调用add方***影响到subSet集合中的值。否则不会影响。



发表于 2022-10-09 10:17:09 回复(1)
subSet是指向原集合的,如果原集合在这个范围内进行了修改,那么子集也将收到影响。
两个boolean类型是是否包含边界值的。
发表于 2022-03-12 09:05:54 回复(0)
subset()方法   ---返回的集合支持支持原集合所有可选的设置操作。  返回的集合是原集合的映射  如果原集合有变化  那么返回的集合也会有变化的 
发表于 2021-10-13 14:23:18 回复(0)
蒙对了,居然不知道有subset这个方法,看来我的基础是真的弱
发表于 2020-03-07 07:43:42 回复(1)
1.subset指向原数据,原数据修改其也会修改 2.subset是闭集合
发表于 2022-06-15 20:20:45 回复(0)
TreeSet的subset只是返回集合的一部分,一个截取一段,不论后边对集合有什么操作,显示的是最终的集合的一部分
发表于 2021-11-27 10:20:13 回复(0)
条件:取偶考察:截取、指向set : 6 8 10 12subSet : 取set 8~11,得到 8 10subSet指向set,set放入 9,满足截取范围,subSet得到 9最终:set : 6 8 9 10 12subSet : 8 9 10
发表于 2021-10-25 07:44:58 回复(0)
Set.subSet(开始元素,是否包含,结束元素,是否包含) 没有用过这个api,还以为是根据索引截取
编辑于 2020-09-09 09:37:45 回复(0)
subSet是指向原集合的,如果原集合在这个范围内进行了修改,那么子集也将收到影响,两个true是确认是否包含边界值的。
发表于 2022-06-30 17:14:49 回复(0)
不是先subset后add吗?为什么sub中会有609呢?
发表于 2022-03-21 11:19:32 回复(1)
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都为真。返回的集合与原集合相映射,因此返回集合中的更改将反映在该集合中,反之亦然。返回的集合支持该集合支持的所有原集合的操作。

发表于 2021-12-20 18:29:02 回复(0)
sublist及subSet方法都会同步修改原始数据
发表于 2021-11-26 09:51:57 回复(1)