Java 排序集
Java集合教程 - Java排序集
排序集是在其元素上有排序的集合。
SortedSet 接口表示Java集合中的排序集合框架。
排序集中的元素可以按照自然顺序排序可比较的接口或使用 Comparator 。
SortedSet 必须知道如何在添加元素时对其元素进行排序检查两个接口:
- 如果它的元素实现了Comparable接口,它将使用compareTo()方法来排序项目。 我们可以称之为自然顺序排序。
- 我们可以传递一个比较器做自定义排序。
如果指定了 Comparator ,则 Comparator 是用于排序并忽略 Comparable 接口。
TreeSet 类是Collection框架中SortedSet接口的一个实现。
例子
在下面的代码中,我们添加 String 对象 SortedSet 。
String 类实现 Comparable 接口。
SortedSet将使用 Comparable 接口及其 compareTo()方法对String值进行排序。
import java.util.SortedSet;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
// Create a sorted set of some names
SortedSet<String> sortedNames = new TreeSet<>();
sortedNames.add("Java");
sortedNames.add("SQL");
sortedNames.add("HTML");
sortedNames.add("CSS");
// Print the sorted set of names
System.out.println(sortedNames);
}
}
上面的代码生成以下结果。

例2
以下代码显示如何存储在 SortedSet 中的人物对象列表。
我们不能添加Person类的对象在SortedSet中,除非我们还提供一个 Comparator 对象因为Person类不实现 Comparable 接口。
以下代码创建一个 SortedSet 的使用 Comparator 的人使用他们的名字排序的人:
SortedSet<Person> personsSortedByName = new TreeSet<>(Comparator.comparing(Person::getName));
该代码使用方法引用来创建用于创建Comparator对象的lambda表达式。
import java.util.Comparator;
import java.util.SortedSet;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
SortedSet<Person> personsById = new TreeSet<>(
Comparator.comparing(Person::getId));
personsById.add(new Person(1, "X"));
personsById.add(new Person(2, "Z"));
personsById.add(new Person(3, "A"));
personsById.add(new Person(4, "C"));
personsById.add(new Person(4, "S")); // A duplicate Person
System.out.println("Persons by Id:");
personsById.forEach(System.out::println);
SortedSet<Person> personsByName = new TreeSet<>(
Comparator.comparing(Person::getName));
personsByName.add(new Person(1, "X"));
personsByName.add(new Person(2, "Z"));
personsByName.add(new Person(3, "A"));
personsByName.add(new Person(4, "C"));
System.out.println("Persons by Name: ");
personsByName.forEach(System.out::println);
}
}
class Person {
private int id;
private String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Person)) {
return false;
}
// id must be the same for two Persons to be equal
Person p = (Person) o;
if (this.id == p.getId()) {
return true;
}
return false;
}
@Override
public int hashCode() {
return this.id;
}
@Override
public String toString() {
return "(" + id + ", " + name + ")";
}
}
上面的代码生成以下结果。

例3
SortedSet 接口继承了 Set 接口的所有方法,并添加了一些方法来返回子集。
subSet(E fromElement,E toElement)方法从 SortedSet 返回fromElement(包含)和toElement(exclusive)之间的元素。
import java.util.SortedSet;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
SortedSet<String> names = new TreeSet<>();
names.add("HTML");
names.add("Java");
names.add("SQL");
names.add("CSS");
System.out.println("Sorted Set: " + names);
System.out.println("First: " + names.first());
System.out.println("Last: " + names.last());
SortedSet<String> ssBeforeCSS = names.headSet("CSS");
System.out.println(ssBeforeCSS);
SortedSet<String> ssBetwenCSSAndHTML = names.subSet("CSS", "HTML");
System.out.println(ssBetwenCSSAndHTML);
SortedSet<String> ssBetwenCSSAndHTML2 = names.subSet("CSS", "HTML");
System.out.println(ssBetwenCSSAndHTML2);
SortedSet<String> ssCSSAndAfter = names.tailSet("CSS");
System.out.println(ssCSSAndAfter);
}
}
上面的代码生成以下结果。

例4
以下代码片段使用 Comparator 创建一个 SortedSet ,它将null元素放在第一位:
import java.util.Comparator;
import java.util.SortedSet;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
// Sort the names based on their length, placing null first
SortedSet<String> names = new TreeSet<>(Comparator.nullsFirst(Comparator
.comparing(String::length)));
names.add("XML");
names.add("CSS");
names.add("HTML");
names.add(null); // Adds a null
// Print the names
names.forEach(System.out::println);
}
}
上面的代码生成以下结果。


免费 AI IDE


更多建议: