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); } }
上面的代码生成以下结果。
更多建议: