Java 排序集

2018-02-20 02:39 更新

Java集合教程 - Java排序集


排序集是在其元素上有排序的集合。

SortedSet 接口表示Java集合中的排序集合框架。

排序集中的元素可以按照自然顺序排序可比较的接口或使用 Comparator

SortedSet 必须知道如何在添加元素时对其元素进行排序检查两个接口:

  • 如果它的元素实现了Comparable接口,它将使用compareTo()方法来排序项目。 我们可以称之为自然顺序排序。
  • 我们可以传递一个比较器做自定义排序。

如果指定了 Comparator ,则 Comparator 是用于排序并忽略 Comparable 接口。

TreeSet 类是Collection框架中SortedSet接口的一个实现。

TreeSet API

SortedSet API


例子

在下面的代码中,我们添加 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);

  }

}

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

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号