一个神奇的题: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);

A. 编译失败
B. 发生运行时异常
C. [606, 608, 609,610, 612] [608, 609,610]
D. [606, 608, 609,610, 612] [608,610]


答案是:C


题目来源:牛客网
链接:https://www.nowcoder.com/questionTerminal/9643a55b528743f6a68ac7adf9072ea0

题目分析

  • subSet(左边界,左边界是否取值,右边界,右边界是否取值)

  • subset(form,true,to,true)是Treeset的非静态方法,subSet是指向原数据的,原数据修改,subSet也跟着修改

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

    subSet()返回集合中元素范围从fromElement到toElement的部分的视图。如果fromElement和toElement相等,则返回的集合为空,除非fromInclusive和toInclusive都为真。返回的集合与原集合相映射,因此返回集合中的更改将反映在该集合中,反之亦然。返回的集合支持该集合支持的所有原集合的操作。

举个例子:

TreeSet set = new TreeSet();
TreeSet subSet = new TreeSet();

for(int i=606;i<613;i++){
    if(i%2==0){
     ts.add(i);
     }
 }
  • 情况1:
    //true表示包含边界值(608和611),false表示不包含
    subSet = (TreeSet)ts.subSet(608,true,611,true);
    System.out.println(subSet); // 输出[608, 610]
    
  • 情况2:set添加
    //609在608和611之间,所以可以同时添加到set和subSet中
    set.add(609);
    System.out.println(set); // 输出[606, 608, 609,610, 612]
    System.out.println(subSet); // 输出[608, 609 , 610]
    
  • 情况3:set添加
    //629不在608和611之间,所以不能添加到subSet中,但可以添加到set中
    set.add(629);  
    System.out.println(set); //输出 set=[606, 608, 610, 612,629]
    System.out.println(subSet); // sebSet=[608, 610]
    
  • 情况4:subSet添加
    //609在608和611之间,所以可以同时添加到ts和ts2中
    subSet.add(609);  
    //输出 set=[606, 608, 610, 609, 612]
    // subSet=[608, 609, 610]
    
  • 情况5:subSet添加
    //609不在608和611之间,所以通过ts2添加时会报错
    subSet.add(609);  
    //报错:IllegalArgumentException: key out of range
    
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值