亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> java

掌握 Java TreeSet:操作、方法与实战示例全解析

Java TreeSet

TreeSet 类提供树数据结构功能,实现了 NavigableSet 接口。


创建 TreeSet

先导入 java.util.TreeSet,再创建实例:

TreeSet<Integer> numbers = new TreeSet<>();

无参构造按自然顺序(升序)排序。也可通过 Comparator 自定义排序规则。


TreeSet 方法


插入元素

import java.util.TreeSet;
class Main {
    public static void main(String[] args) {
        TreeSet<Integer> evenNumbers = new TreeSet<>();
        evenNumbers.add(2);
        evenNumbers.add(4);
        evenNumbers.add(6);
        System.out.println("TreeSet: " + evenNumbers);
        TreeSet<Integer> numbers = new TreeSet<>();
        numbers.add(1);
        numbers.addAll(evenNumbers);
        System.out.println("New TreeSet: " + numbers);
    }
}

输出

TreeSet: [2, 4, 6]
New TreeSet: [1, 2, 4, 6]

访问元素

可使用 iterator() 方法遍历,需导入 java.util.Iterator:

import java.util.TreeSet;
import java.util.Iterator;
class Main {
    public static void main(String[] args) {
        TreeSet<Integer> numbers = new TreeSet<>();
        numbers.add(2);
        numbers.add(5);
        numbers.add(6);
        System.out.println("TreeSet: " + numbers);
        Iterator<Integer> iterate = numbers.iterator();
        System.out.print("TreeSet using Iterator: ");
        while(iterate.hasNext()) {
            System.out.print(iterate.next() + ", ");
        }
    }
}

输出

TreeSet: [2, 5, 6]
TreeSet using Iterator: 2, 5, 6, 

移除元素

import java.util.TreeSet;
class Main {
    public static void main(String[] args) {
        TreeSet<Integer> numbers = new TreeSet<>();
        numbers.add(2);
        numbers.add(5);
        numbers.add(6);
        System.out.println("TreeSet: " + numbers);
        boolean value1 = numbers.remove(5);
        System.out.println("Is 5 removed? " + value1);
        boolean value2 = numbers.removeAll(numbers);
        System.out.println("Are all elements removed? " + value2);
    }
}

输出

TreeSet: [2, 5, 6]
Is 5 removed? true
Are all elements removed? true

TreeSet 实现 NavigableSet,提供丰富导航方法。

1. first() 和 last() 方法

import java.util.TreeSet;
class Main {
    public static void main(String[] args) {
        TreeSet<Integer> numbers = new TreeSet<>();
        numbers.add(2);
        numbers.add(5);
        numbers.add(6);
        System.out.println("TreeSet: " + numbers);
        int first = numbers.first();
        System.out.println("First Number: " + first);
        int last = numbers.last();
        System.out.println("Last Number: " + last);
    }
}

输出

TreeSet: [2, 5, 6]
First Number: 2
Last Number: 6

2. ceiling()、floor()、higher() 和 lower() 方法

import java.util.TreeSet;
class Main {
    public static void main(String[] args) {
        TreeSet<Integer> numbers = new TreeSet<>();
        numbers.add(2);
        numbers.add(5);
        numbers.add(4);
        numbers.add(6);
        System.out.println("TreeSet: " + numbers);
        System.out.println("Using higher: " + numbers.higher(4));
        System.out.println("Using lower: " + numbers.lower(4));
        System.out.println("Using ceiling: " + numbers.ceiling(4));
        System.out.println("Using floor: " + numbers.floor(3));
    }
}

输出

TreeSet: [2, 4, 5, 6]
Using higher: 5
Using lower: 2
Using ceiling: 4
Using floor: 2

3. pollFirst() 和 pollLast() 方法

import java.util.TreeSet;
class Main {
    public static void main(String[] args) {
        TreeSet<Integer> numbers = new TreeSet<>();
        numbers.add(2);
        numbers.add(5);
        numbers.add(4);
        numbers.add(6);
        System.out.println("TreeSet: " + numbers);
        System.out.println("Removed First Element: " + numbers.pollFirst());
        System.out.println("Removed Last Element: " + numbers.pollLast());
        System.out.println("New TreeSet: " + numbers);
    }
}

输出

TreeSet: [2, 4, 5, 6]
Removed First Element: 2
Removed Last Element: 6
New TreeSet: [4, 5]

4. headSet()、tailSet() 和 subSet() 方法


headSet(element, booleanValue)

返回指定元素之前的所有元素。booleanValue 可选,默认 false。为 true 时包含指定元素。

import java.util.TreeSet;
class Main {
    public static void main(String[] args) {
        TreeSet<Integer> numbers = new TreeSet<>();
        numbers.add(2);
        numbers.add(5);
        numbers.add(4);
        numbers.add(6);
        System.out.println("TreeSet: " + numbers);
        System.out.println("Using headSet without boolean value: " + numbers.headSet(5));
        System.out.println("Using headSet with boolean value: " + numbers.headSet(5, true));
    }
}

输出

TreeSet: [2, 4, 5, 6]
Using headSet without boolean value: [2, 4]
Using headSet with boolean value: [2, 4, 5]

tailSet(element, booleanValue)

返回指定元素之后的所有元素(含该元素)。booleanValue 可选,默认 true。为 false 时不包含指定元素。

import java.util.TreeSet;
class Main {
    public static void main(String[] args) {
        TreeSet<Integer> numbers = new TreeSet<>();
        numbers.add(2);
        numbers.add(5);
        numbers.add(4);
        numbers.add(6);
        System.out.println("TreeSet: " + numbers);
        System.out.println("Using tailSet without boolean value: " + numbers.tailSet(4));
        System.out.println("Using tailSet with boolean value: " + numbers.tailSet(4, false));
    }
}

输出

TreeSet: [2, 4, 5, 6]
Using tailSet without boolean value: [4, 5, 6]
Using tailSet with boolean value: [5, 6]

subSet(e1, bv1, e2, bv2)

返回 e1 与 e2 之间的元素(含 e1)。bv1 默认 true,bv2 默认 false。

import java.util.TreeSet;
class Main {
    public static void main(String[] args) {
        TreeSet<Integer> numbers = new TreeSet<>();
        numbers.add(2);
        numbers.add(5);
        numbers.add(4);
        numbers.add(6);
        System.out.println("TreeSet: " + numbers);
        System.out.println("Using subSet without boolean value: " + numbers.subSet(4, 6));
        System.out.println("Using subSet with boolean value: " + numbers.subSet(4, false, 6, true));
    }
}

输出

TreeSet: [2, 4, 5, 6]
Using subSet without boolean value: [4, 5]
Using subSet with boolean value: [5, 6]

集合运算

TreeSet 方法可用于各种集合运算。


并集

使用 addAll() 实现并集:

import java.util.TreeSet;
class Main {
    public static void main(String[] args) {
        TreeSet<Integer> evenNumbers = new TreeSet<>();
        evenNumbers.add(2);
        evenNumbers.add(4);
        System.out.println("TreeSet1: " + evenNumbers);
        TreeSet<Integer> numbers = new TreeSet<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        System.out.println("TreeSet2: " + numbers);
        numbers.addAll(evenNumbers);
        System.out.println("Union is: " + numbers);
    }
}

输出

TreeSet1: [2, 4]
TreeSet2: [1, 2, 3]
Union is: [1, 2, 3, 4]

交集

使用 retainAll() 实现交集:

import java.util.TreeSet;
class Main {
    public static void main(String[] args) {
        TreeSet<Integer> evenNumbers = new TreeSet<>();
        evenNumbers.add(2);
        evenNumbers.add(4);
        System.out.println("TreeSet1: " + evenNumbers);
        TreeSet<Integer> numbers = new TreeSet<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        System.out.println("TreeSet2: " + numbers);
        numbers.retainAll(evenNumbers);
        System.out.println("Intersection is: " + numbers);
    }
}

输出

TreeSet1: [2, 4]
TreeSet2: [1, 2, 3]
Intersection is: [2]

差集

使用 removeAll() 计算差集:

import java.util.TreeSet;
class Main {
    public static void main(String[] args) {
        TreeSet<Integer> evenNumbers = new TreeSet<>();
        evenNumbers.add(2);
        evenNumbers.add(4);
        System.out.println("TreeSet1: " + evenNumbers);
        TreeSet<Integer> numbers = new TreeSet<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.add(4);
        System.out.println("TreeSet2: " + numbers);
        numbers.removeAll(evenNumbers);
        System.out.println("Difference is: " + numbers);
    }
}

输出

TreeSet1: [2, 4]
TreeSet2: [1, 2, 3, 4]
Difference is: [1, 3]

子集判断

使用 containsAll() 判断是否为子集:

import java.util.TreeSet;
class Main {
    public static void main(String[] args) {
        TreeSet<Integer> numbers = new TreeSet<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.add(4);
        System.out.println("TreeSet1: " + numbers);
        TreeSet<Integer> primeNumbers = new TreeSet<>();
        primeNumbers.add(2);
        primeNumbers.add(3);
        System.out.println("TreeSet2: " + primeNumbers);
        boolean result = numbers.containsAll(primeNumbers);
        System.out.println("Is TreeSet2 subset of TreeSet1? " + result);
    }
}

输出

TreeSet1: [1, 2, 3, 4]
TreeSet2: [2, 3]
Is TreeSet2 subset of TreeSet1? True

TreeSet 其他方法

方法描述
clone()创建 TreeSet 副本
contains()搜索指定元素并返回布尔结果
isEmpty()检查 TreeSet 是否为空
size()返回 TreeSet 大小
clear()移除所有元素

详见官方文档:Java TreeSet。


TreeSet 与 HashSet 对比


TreeSet Comparator 自定义排序

默认自然排序,可通过 Comparator 自定义:

import java.util.TreeSet;
import java.util.Comparator;
class Main {
    public static void main(String[] args) {
        TreeSet<String> animals = new TreeSet<>(new CustomComparator());
        animals.add("Dog");
        animals.add("Zebra");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("TreeSet: " + animals);
    }
    public static class CustomComparator implements Comparator<String> {
        @Override
        public int compare(String animal1, String animal2) {
            int value = animal1.compareTo(animal2);
            if (value > 0) return -1;
            else if (value < 0) return 1;
            else return 0;
        }
    }
}

输出

TreeSet: [Zebra, Horse, Dog, Cat]

传入 CustomComparator 实现逆序排序。详见 Java Comparator 官方文档。

java

  1. MATLAB 数值类型详解:存储、转换与范围查询
  2. 精通 Java 运算符:类型、语法与实战示例
  3. Java 注释:类型、用法与最佳实践
  4. 精通 Java 增强 for 循环:语法、示例与最佳实践
  5. 精通 Java 字符串:创建、方法与最佳实践
  6. 精通 Java 接口:概念、实现与最佳实践
  7. 精通 Java 匿名内部类:定义、语法与实战示例
  8. 精通 Java Try-With-Resources:自动资源管理详解
  9. Java 注解详解:类型、放置位置与实战示例
  10. Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
  11. 掌握 Java 集合算法:排序、打乱、搜索与更多实用操作
  12. Java 生成随机数实战:Random 与 Math.random 详解