Java 中的 TreeSet subSet() 方法
TreeSet
是 Java 集合框架中实现有序集合的一个类。通过使用 TreeSet
,可以实现对集合元素进行自然排序或者使用自定义比较器进行排序。而 subSet()
方法是 TreeSet
中一个非常重要的方法,它可以返回一个给定范围内的子集。
方法介绍
subSet(E fromElement, E toElement)
方法会返回一个由 fromElement
(包含)和 toElement
(不包含)之间的元素组成的子集。也就是说,返回 TreeSet
中这个范围内的所有元素。
另外,subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)
方法也可以返回指定范围内的子集。其中,fromInclusive
和 toInclusive
分别表示起始和结束元素是否包含在子集中。
这两个方法都返回一个子集 TreeSet
,由于 TreeSet
是有序集合,所以子集也是有序的。
示例代码
import java.util.TreeSet;
public class TreeSetExample{
public static void main(String[] args) {
// 创建一个字符串类型的 treeset 并添加元素
TreeSet<String> treeSet = new TreeSet<String>();
treeSet.add("apple");
treeSet.add("banana");
treeSet.add("peach");
treeSet.add("orange");
// 返回指定范围内的子集
TreeSet<String> subSet1 = new TreeSet<String>(treeSet.subSet("apple", "peach"));
System.out.println("subSet1: " + subSet1);
// 返回指定范围内的子集,包含 fromElement
TreeSet<String> subSet2 = new TreeSet<String>(treeSet.subSet("apple", true, "peach", false));
System.out.println("subSet2: " + subSet2);
// 返回指定范围内的子集,包含 fromElement 和 toElement
TreeSet<String> subSet3 = new TreeSet<String>(treeSet.subSet("apple", true, "peach", true));
System.out.println("subSet3: " + subSet3);
}
}
输出结果:
subSet1: [apple, banana]
subSet2: [apple, banana]
subSet3: [apple, banana, peach]
在上面的示例中,我们首先创建了一个 TreeSet
,然后添加了几个字符串元素。接着,我们使用 subSet()
方法生成了三个子集,分别通过不同的参数来指定子集的范围。
注意,当我们使用 subSet()
方法生成子集时,子集的元素是引用了原 TreeSet
中的元素的,所以改变子集中的元素会影响原 TreeSet
中的元素。
异常情况
需要注意的是,subSet()
方法在一些情况下会抛出异常。
假设有一个 TreeSet
包含如下元素:
{"apple", "banana", "peach", "orange"}
如果我们执行以下代码:
treeSet.subSet("peach", "apple").forEach(System.out::println);
则会抛出 IllegalArgumentException
异常,因为 fromElement
比 toElement
大,所以该范围不存在元素。
同样的,如果我们执行以下代码:
treeSet.subSet("non-existing", "another-non-existing").forEach(System.out::println);
则不会输出任何元素,因为这并不是一个合法的范围(即这两个字符串都不在 TreeSet
中),但也不会抛出异常。
结论
通过 subSet()
方法,我们可以很方便地获取一个 TreeSet
中指定范围内的子集。这个方法非常实用,可以大大提高编程效率。同时,在使用该方法时需要注意范围的正确性,否则可能会抛出异常。