Day11_50_SortedMap集合
SortedMap集合
-
二叉查找树 和 二叉平衡树
-
二叉查找树是一种有序的树,所有的左孩子的value值都是小于叶子结点的value值的,所有右孩子的value值都是大于叶子结点的。这样做的好处在于:如果需要按照键值查找数据元素,只要比较当前结点的value值即可(小
于当前结点value值的,往左走,否则往右走),这种方式,每次可以减少一半的操作,所以效率比较高。 -
比二叉查找树更进一步的是二叉平衡树,二叉平衡树除了保证有序外,还能够保持每个节点左右子树的高度相差不超过1。常见的平衡树有AVL树,Treap,红黑树,伸展树,等等。
-
红黑树是在每个节点上增加一个存储位表示节点的颜色,可以是RED或BLACK。通过对任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。
-
在TreeMap中,就是使用了红黑树。(HashMap在一个数组元素位里的链表长度过长时,也会把链表转为红黑树来存储数据。
-
-
SortedMap是一个接口,TreeMap是 SortedMap下的实现类, SortedMap是无序不可重复的,但可以对Key部分自动排序。
-
SortedMap集合实现自动排序需要Key(类)实现Comparable接口,或者单独写一个比较器。
-
SortedMap集合接口 相比 Map接口,主要增加了 comparator() 等比较相关方法,在定义中指出返回的 Set 应该是有序的。
-
代码实例
- 主类 ``` import java.util.Iterator; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; public class SortedMapTest01 { public static void main(String[] args) { // 创建SortedMap集合 SortedMap produceMap=new TreeMap(new ProductComporator()); //传入比较器 // 创建商品对象 Product product1=new Product("ZARA 新款 男装 慢跑式腰身亚麻裤 08574423707",299); Product product2=new Product("CONVERSE匡威官方1970s米白色高帮经典帆布鞋三星标情侣款162053C",599); Product product3=new Product("New Balance多边形金属眼镜框防辐射近视眼镜架女可配镜片",432); // 将创建的对象添加到集合中 produceMap.put(product1,2); //2 会自动装箱 produceMap.put(product2,8); produceMap.put(product3,6); //查看集合的大小 int size=produceMap.size(); System.out.println(size); // 遍历集合 Set keySet=produceMap.keySet(); Iterator iterator=keySet.iterator(); while(iterator.hasNext()){ Object keys=iterator.next(); Object values=produceMap.get(keys); System.out.println(keys+"------->"+values+"件"); } } }
-
产品类 实现了Comparable接口
public class Product implements Comparable{ //属性 String name ; double price; //构造方法 Product(){} Product(String name ,double price){ this.name=name; this.price=price; } //重写toString()方法 public String toString(){ return "Product[商品名:"+name+" 商品价格:"+price+"]"; } // 实现Comparable接口,重写 compareTo()方法,按照商品价格排序 @Override public int compareTo(Object o) { double price1=this.price; double price2=((Product)o).price; if(price1>price2){ return 1; }else if(price1<price2){ return -1; }else{ return 0; } }
}
- 单独写一个比较器
```
import java.util.Comparator;
//Product类的比较器
public class ProductComporator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
double price1=((Product)o1).price;
double price2=((Product)o2).price;
if(price1==price2){
return 0;
}else if(price1<price2){
return 1;
}else{
return -1;
}
}
}