Java TreeSet类使用教程

x33g5p2x  于2021-08-21 转载在 Java  
字(5.6k)|赞(0)|评价(0)|浏览(418)

TreeSet类的概述

以下是关于Java中TreeSet的几个关键点,需要注意的是:

  • TreeSet不能包含重复的元素。
  • TreeSet中的元素按其自然排序,或根据创建TreeSet时提供的自定义比较器进行排序。
  • TreeSet不能包含null的值。
  • TreeSet内部使用TreeMap来存储元素。
  • TreeSet类内部使用TreeMap来存储元素。
  • 这个实现为基本操作(添加、删除和包含)提供了保证的log(n)时间成本。
  • TreeSet的实现是不同步的--如果多个线程同时访问一个树集,并且至少有一个线程修改了该树集,那么它必须在外部进行同步。例子。
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
  • 这个类的迭代器方法返回的迭代器是快速失败的:如果在迭代器创建后的任何时候,集合被修改,除了通过迭代器自己的移除方法,迭代器将抛出一个ConcurrentModificationException

###创建TreeSet实例

// Creating a TreeSet
TreeSet<String> fruits = new TreeSet<>();

// Adding new elements to a TreeSet
fruits.add("Banana");
fruits.add("Apple");
fruits.add("Pineapple");
fruits.add("Orange");

System.out.println("Fruits Set : " + fruits);

// Duplicate elements are ignored
fruits.add("Apple");
System.out.println("After adding duplicate element \"Apple\" : " + fruits);

// This will be allowed because it's in lowercase.
fruits.add("banana");
System.out.println("After adding \"banana\" : " + fruits);

输出。

Fruits Set : [Apple, Banana, Orange, Pineapple]
After adding duplicate element "Apple" : [Apple, Banana, Orange, Pineapple]
After adding "banana" : [Apple, Banana, Orange, Pineapple, banana]

注意,在这个例子中,重复的元素被忽略了。

TreeSet带有一个自定义比较器(不区分大小写的顺序)

让我们创建一个带有自定义比较器的TreeSet,通过忽略大小写对元素进行排序。

// Creating a TreeSet with a custom Comparator (Case Insensitive Order)
SortedSet<String> weekDays = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
// Adding new elements to a TreeSet
weekDays.add("Monday");
weekDays.add("Tuesday");
weekDays.add("Wednesday");
weekDays.add("Thursday ");
weekDays.add("Friday ");
weekDays.add("Saturday  ");
weekDays.add("Sunday");

System.out.println("weekDays Set : " + weekDays);

// Now, lowercase elements will also be considered as duplicates
weekDays.add("sunday");
System.out.println("After adding \"sunday\" : " + weekDays);

输出:

weekDays Set : [Friday , Monday, Saturday  , Sunday, Thursday , Tuesday, Wednesday]
After adding "sunday" : [Friday , Monday, Saturday  , Sunday, Thursday , Tuesday, Wednesday]

注意,'sunday'元素是不区分大小写的,它被忽略了。

TreeSet与自定义Comparator示例(降序)

// Creating a TreeSet with a custom Comparator (Descending  Order)
SortedSet<String> weekDays = new TreeSet<>(Comparator.reverseOrder());
// Adding new elements to a TreeSet
weekDays.add("Monday");
weekDays.add("Tuesday");
weekDays.add("Wednesday");
weekDays.add("Thursday ");
weekDays.add("Friday ");
weekDays.add("Saturday  ");
weekDays.add("Sunday");

System.out.println("weekDays Set : " + weekDays);

输出。

weekDays Set : [Wednesday, Tuesday, Thursday , Sunday, Saturday  , Monday, Friday ]

###访问TreeSet的元素

例子 1: 求一个TreeSet的大小。

TreeSet<String> students = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);

students.add("Ramesh");
students.add("Prakash");
students.add("Amir");
// Finding the size of a TreeSet
System.out.println("Number of elements in the TreeSet : " + students.size());

例2: 检查一个元素是否存在于一个TreeSet中。

TreeSet<String> students = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);

students.add("Ramesh");
students.add("Prakash");
students.add("Amir");

// Check if an element exists in the TreeSet
String name = "Julia";
if(students.contains(name)) {
 System.out.println("TreeSet contains the element : " + name);
} else {
 System.out.println("TreeSet does not contain the element : " + name);
}

例3:查找TreeSet中的第一个元素。

TreeSet<String> students = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);

students.add("Ramesh");
students.add("Prakash");
students.add("Amir");

// Navigating through the TreeSet
System.out.println("First element : " + students.first());

例4:查找TreeSet中的最后一个元素。

TreeSet<String> students = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);

students.add("Ramesh");
students.add("Prakash");
students.add("Amir");
System.out.println("Last element : " + students.last());

例5:在TreeSet中找到比给定元素高的元素。

TreeSet<String> students = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);

students.add("Ramesh");
students.add("Prakash");
students.add("Amir");
String name = "amir";
System.out.println("Element just greater than "  + name + " : " + students.higher(name));

例6: 在TreeSet中找到刚好比给定元素低的元素。

TreeSet<String> students = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);

students.add("Ramesh");
students.add("Prakash");
students.add("Amir");
String name = "amir";
System.out.println("Element just lower than "  + name + " : " + students.lower(name));

###从一个TreeSet中删除元素

例1: 从TreeSet中删除一个元素。

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

numbers.add(10);
numbers.add(15);
numbers.add(20);
numbers.add(25);

// Remove an element from the TreeSet
boolean isRemoved = numbers.remove(49);

例2: 删除所有满足给定谓词的元素。

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

numbers.add(10);
numbers.add(15);
numbers.add(20);
numbers.add(25);
// Remove all elements divisible by 3
numbers.removeIf(number -> number % 3 == 0);

例3: 删除TreeSet的第一个元素。

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

numbers.add(10);
numbers.add(15);
numbers.add(20);
numbers.add(25);
// Retrieve and remove the first element from the TreeSet
Integer num = numbers.pollFirst();
System.out.println("Removed first element " + num + " from the TreeSet : " + numbers);

例4:移除TreeSet的最后一个元素。

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

numbers.add(10);
numbers.add(15);
numbers.add(20);
numbers.add(25);
// Retrieve and remove the last element from the TreeSet
num = numbers.pollLast();
System.out.println("Removed last element " + num + " from the TreeSet : " + numbers);

相关文章

微信公众号

最新文章

更多