当前位置: 首页 > 工具软件 > Subset > 使用案例 >

一个神奇的题:set 和 subSet

黄凌龙
2023-12-01

题目

以下程序的运行结果是:( )

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
    
 类似资料: