2021-04-18 11:19  阅读(102)
文章分类:Java 基础教程 文章标签:JavaJava 教程
©  原文作者:w3cschool 原文地址:https://www.w3cschool.cn/java/java-collections-traversing.html

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

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

202104181111112_1.png

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

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

2021041811116_2.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<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);
    
      }
    
    }
    

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

2021041811111_3.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<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);
    
      }
    
    }
    

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

2021041811110_4.png

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> Java 排序集
上一篇
Java Set集合
下一篇
Java 导航集