java排序_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 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);

}

}

上面的代码生成以下结果。

95d391a31adcc5a53ba2b98bf95805fa.png

例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 + ")";

}

}

上面的代码生成以下结果。

f8e82f45b1206e05304a3c78c4ce1edd.png

例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);

}

}

上面的代码生成以下结果。

16ac6f0f9be69bd8e12077978cbb1e4e.png

例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);

}

}

上面的代码生成以下结果。

40a5ce21154f2908c697a8effd2c573d.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值