首先要明确的一点是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(也可以理解为左闭右开)