Core Java Tutorial -,corejavatutorial
Core Java Tutorial -,corejavatutorial
Java TreeSet 是 java.util.SortedSet
的最流行的实现。SortedSet 是继承 java.util.Set
的接口。Java Sorted Set 提供其元素的总排序。
Java TreeSet
换句话说,在迭代 TreeSet 时,我们可以期望排序的数据。Java TreeSet 元素按照其自然顺序排序,或者我们可以在创建 SortedSet 时提供一个 Comparator。如果我们在创建 Set 期间未提供特定的比较器,则元素必须实现 Comparable 以确保自然排序。
Java TreeSet Constructors
TreeSet 是 SortedSet 非常流行的实现。按照规范,所有 Sorted Set 实现类都应该提供 4 种类型的构造函数。
不幸的是,接口不能包含构造函数。所以,没有办法来执行这些建议。
Java TreeSet Example
现在让我们用不同的方式创建一个有序集合,如上所述,我们将看看不同的Java TreeSet 示栗。
// Create a sorted set of Integers
SortedSet<Integer> setWithNaturalOrdering = new TreeSet<>();
setWithNaturalOrdering.add(5);
setWithNaturalOrdering.add(9);
setWithNaturalOrdering.add(4);
setWithNaturalOrdering.add(2);
setWithNaturalOrdering.forEach(System.out::println);
输出结果:
2
4
5
9
Java TreeSet Comparable
现在,我们将使用 Person 类的对象创建一个有序集合。要提供自然排序 Person 类应该具有 Comparable 接口的实现。
class Person implements Comparable<Person> {
int id;
String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public int compareTo(Person p) {
return this.name.compareTo(p.name);
}
@Override
public String toString() {
return this.name;
}
}
// Create a sorted set with user defined class
SortedSet<Person> sortedSet = new TreeSet<>();
sortedSet.add(new Person(1, "Mark"));
sortedSet.add(new Person(2, "Vispi"));
sortedSet.add(new Person(3, "Harmony"));
sortedSet.forEach(System.out::println);
输出结果:
Harmony
Mark
Vispi
Java TreeSet Comparator
为了提供不同的排序,我们需要在创建 Sorted Set 时传递自定义比较器实现。栗如,让我们根据 Person 类的 id 属性进行排序。
SortedSet<Person> sortedSet = new TreeSet<>();
sortedSet.add(new Person(1, "Mark"));
sortedSet.add(new Person(2, "Vispi"));
sortedSet.add(new Person(3, "Harmony"));
sortedSet.forEach(System.out::println);
SortedSet<Person> customOrderedSet = new TreeSet<>((p1, p2) -> p1.id - p2.id);
customOrderedSet.addAll(sortedSet);
customOrderedSet.forEach(System.out::println);
输出结果:
Mark
Vispi
Harmony
Java Sorted Set Example
我们也可以通过传递另一个集合对象或不同的排序集来创建排序集。
List<Person> listOfPerson = Arrays.asList(new Person(1, "Mark"), new Person(2, "Vispi"), new Person(3, "Harmony"));
SortedSet<Person> sortedSetFromCollection = new TreeSet<>(listOfPerson);
SortedSet<Person> copiedSet = new TreeSet<>(sortedSetFromCollection);
copiedSet.forEach(System.out::println);
输出结果:
Harmony
Mark
Vispi
Java SortedSet Methods
由于 SortedSet 的排序性质,与 Set 先比,SortedSet 肯定会获得一些额外的权限。正如你可能已经猜到的那用,除了来自 Set 接口的继承方法之外,它还提供了一些其他方法。
Java SortedSet Implementation
让我们看看这些方法。我们将通过传递一个比较器来创建一个有序集合。这里 comparator()
方法将返回相同的比较器:
SortedSet<Integer> intSet = new TreeSet<>(Comparator.naturalOrder());
intSet.addAll(Arrays.asList(7, 2, 1, 4, 6, 5));
Comparator comparator = intSet.comparator();
现在,然我们使用 SubSet(from, to)
方法找到子集。请注意,对自己所做的更改也会反映到原始集上。
SortedSet<Integer> subSet = intSet.subSet(2, 5);
System.out.println(subSet);
subSet.add(3);
System.out.println(intSet);
输出:
[2, 4]
[1, 2, 3, 4, 5, 6, 7]
相似的,我们来看看别的方法:
subSet = intSet.headSet(3);
System.out.println("Head set");
System.out.println(subSet);
subSet = intSet.tailSet(3);
System.out.println("Tail set");
System.out.println(subSet);
System.out.println("Retrieving lowest and highest elements respectively");
System.out.println(intSet.first());
System.out.println(intSet.last());
输出:
Head set
[1, 2]
Tail set
[3, 4, 5, 6, 7]
Retrieving lowest and highest elements respectively
1
7
相关文章
- 暂无相关文章
用户点评