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 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 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 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 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 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 ssBeforeCSS = names.headSet("CSS");
System.out.println(ssBeforeCSS);
SortedSet ssBetwenCSSAndHTML = names.subSet("CSS", "HTML");
System.out.println(ssBetwenCSSAndHTML);
SortedSet ssBetwenCSSAndHTML2 = names.subSet("CSS", "HTML");
System.out.println(ssBetwenCSSAndHTML2);
SortedSet 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 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);
}
}
上面的代码生成以下结果。