java笔记有序集合SortedSet和有序映射SortedMap的使用

Posted 棉花糖灬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java笔记有序集合SortedSet和有序映射SortedMap的使用相关的知识,希望对你有一定的参考价值。

首先要明确的一点是java中原生的Set和Map是不具备排序能力的,即在遍历时是无顺序的。而 SortedSet和SortedMap接口提供了Set和Map的排序功能。 注意两者是接口。

1. SortedSet接口

(1) 实例

直接来看例子:

package ecnu.cn;

import java.util.*;

public class MyTest {

    public static class MyClass {
        Integer x;
        String y;

        public MyClass(Integer x, String y) {
            this.x = x;
            this.y = y;
        }

        public Integer getX() {
            return x;
        }

        public String getY() {
            return y;
        }
    }

    public static void main(String[] args) {
        // 定义SortedSet并重写compare函数
        SortedSet<MyClass> set = new TreeSet<MyClass>(new Comparator<MyClass>() {
            @Override
            public int compare(MyClass o1, MyClass o2) {
                // return o1.getX() - o2.getX();
                return o1.getY().compareTo(o2.getY());
            }
        });

        // 添加元素
        MyClass clzz1 = new MyClass(1, "345");
        MyClass clzz2 = new MyClass(8, "567");
        MyClass clzz3 = new MyClass(3, "123");
        MyClass clzz4 = new MyClass(5, "433");
        MyClass clzz5 = new MyClass(2, "754");
        set.add(clzz1);
        set.add(clzz2);
        set.add(clzz3);
        set.add(clzz4);
        set.add(clzz5);

        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            MyClass clzz = (MyClass) iterator.next();
            System.out.println("x: " + clzz.getX() + "  y: " + clzz.getY());
        }

        System.out.println("\\nfirst: " + set.first().getX() + "  " + set.first().getY());
        System.out.println("last: " + set.last().getX() + "  " + set.last().getY());
        SortedSet<MyClass> headSet = set.headSet(clzz4);
        SortedSet<MyClass> subSet = set.subSet(clzz1, clzz2);
        SortedSet<MyClass> tailSet = set.tailSet(clzz4);

        System.out.println("\\nheadSet:");
        for (MyClass myClass : headSet) {
            System.out.println("x: " + myClass.getX() + "  y: " + myClass.getY());
        }

        System.out.println("\\nsubSet:");
        for (MyClass myClass : subSet) {
            System.out.println("x: " + myClass.getX() + "  y: " + myClass.getY());
        }

        System.out.println("\\ntailSet:");
        for (MyClass myClass : tailSet) {
            System.out.println("x: " + myClass.getX() + "  y: " + myClass.getY());
        }
    }
}

其对应的输出为:

x: 3  y: 123
x: 1  y: 345
x: 5  y: 433
x: 8  y: 567
x: 2  y: 754

first: 3  123
last: 2  754

headSet:
x: 3  y: 123
x: 1  y: 345

subSet:
x: 1  y: 345
x: 5  y: 433

tailSet:
x: 5  y: 433
x: 8  y: 567
x: 2  y: 754

由于SortedSet是一个接口,为了简单起见直接使用了它的实现类TreeSet来进行实验。如果是String等类型的SortedSet的话,是不需要重写Comparator方法的,而上例中使用了自己的类,所以需要重写。

(2) 常用方法

SortedSet的常用方法主要有以下几种:

  • comparator():比较器,按照用户指定的规则对元素排序
  • first():第一个元素
  • last():最后一个元素
  • headSet(E e):e之前的元素,不包括e(也可以理解为左闭右开)
  • subSet(E e1, E e2):e1和e2之间的元素,左闭右开
  • tailSet(E e):e之后的元素,包括e(也可以理解为左闭右开)

2. SortedMap接口

(1) 实例

也是直接看例子:

package ecnu.cn;

import java.util.*;

public class MyTest {

    public static void main(String[] args) {
        // 定义SortedSet并重写compare函数
        SortedMap<Integer, String> map = new TreeMap<>();
        map.put(3, "345");
        map.put(1, "567");
        map.put(5, "123");
        map.put(8, "433");
        map.put(2, "754");

        for (Integer key : map.keySet()) {
            System.out.println("key: " + key + " value: " + map.get(key));
        }

        System.out.println("\\nfirst: " + map.firstKey());
        System.out.println("last: " + map.lastKey());
        final SortedMap<Integer, String> headMap = map.headMap(3);
        final SortedMap<Integer, String> subMap = map.subMap(2, 5);
        final SortedMap<Integer, String> tailMap = map.tailMap(3);

        System.out.println("\\nheadMap:");
        for (Integer key : headMap.keySet()) {
            System.out.println("key: " + key + "  value: " + headMap.get(key));
        }

        System.out.println("\\nsubMap:");
        for (Integer key : subMap.keySet()) {
            System.out.println("key: " + key + "  value: " + subMap.get(key));
        }

        System.out.println("\\ntailMap:");
        for (Integer key : tailMap.keySet()) {
            System.out.println("key: " + key + "  value: " + tailMap.get(key));
        }
    }
}

其输出为:

key: 1 value: 567
key: 2 value: 754
key: 3 value: 345
key: 5 value: 123
key: 8 value: 433

first: 1
last: 8

headMap:
key: 1  value: 567
key: 2  value: 754

subMap:
key: 2  value: 754
key: 3  value: 345

tailMap:
key: 3  value: 345
key: 5  value: 123
key: 8  value: 433

由于SortedMap是一个接口,为了简单起见直接使用了它的实现类TreeMap来进行实验。SortedMap会自动根据key进行升序排序。可以和SortedSet类似重写Comparator方法来按照指定的方式(只能指定按key排序)进行排序。

(2) 常用方法

SortedMap的常用方法主要有以下几种:

  • comparator():比较器,按照用户指定的规则对元素排序
  • first():第一个元素
  • last():最后一个元素
  • headMap(K k):键k之前的元素,不包括k(也可以理解为左闭右开)
  • subMap(K k1, K k2):键k1和k2之间的元素,左闭右开
  • tailMap(K k):键k之后的元素,包括k(也可以理解为左闭右开)

以上是关于java笔记有序集合SortedSet和有序映射SortedMap的使用的主要内容,如果未能解决你的问题,请参考以下文章

Redis常用操作--------SortedSet(有序集合)

Redis数据结构之有序集合sortedset

Redis数据结构之有序集合sortedset

Redis学习笔记-SortedSet

SortedSet和TreeSet

Redis有序集合Sorted set操作