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;
}
}
}
Day11_50_SortedMap集合的更多相关文章
- java基础集合经典训练题
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...
- .Net多线程编程—并发集合
并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全 ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)
建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...
- java基础_集合List与Set接口
List接口继承了Collection的方法 当然也有自己特有的方法向指定位置添加元素 add(索引,添加的元素); 移除指定索引的元素 remove(索引) 修改指定索引的元素 set ...
- Java基础Collection集合
1.Collection是所有集合的父类,在JDK1.5之后又加入了Iterable超级类(可以不用了解) 2.学习集合从Collection开始,所有集合都继承了他的方法 集合结构如图:
- 轻量级“集合”迭代器-Generator
Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下G ...
- Asp.net MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合
今天为大家分享下 Asp.net MVC 将数据从前台传递到后台的几种方式. 环境:VS2013,MVC5.0框架 1.基本数据类型 我们常见有传递 int, string, bool, double ...
- 这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)
在前2篇文章这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧 和这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,大伙热情高涨.再次拿出自己的私货,在.NET平台 ...
随机推荐
- 手把手教你使用IDEA2020创建SpringBoot项目
一.New Project 二.如图选择Spring Initalizr,选择jdk版本,然后点击Next(注意:SpringBoot2开始至少使用JDK1.8) 三.如图根据自己需要修改,然后点击N ...
- HashMap什么时候进行扩容?
Threshold:table数组元素个数size的大小超过threshold且且Node<K,V>[] table数组长度没有超过64时时table数组扩容.当hashmap中的元素个数 ...
- the import java.util cannot be resolve
重新配置一下build path 的jre,如果不行的话就重新设置jre(在add library中installed JREs)
- HashSet为什么可以有序输出?
首先HashSet是不保证有序,而不是保证无序,因为在HashSet中,元素是按照他们的hashCode值排序存储的.对于单个字符而言,这些hashCode就是ASCII码,因此,当按顺序添加自然数或 ...
- C#语言特性及发展史
本文按照C#语言的发展历史,介绍C#每个版本的新增特性,主要参考微软官方文档.了解这些语言特性可以帮助我们更高效的编写C#代码. C# 1.0 与Visual Studio .NET 2002一起发布 ...
- 将MacOS Catalina 降级为 Mojave
1.下载Mojave https://apps.apple.com/cn/app/macos-mojave/id1398502828?ls=1&mt=12 2.更改U盘格式和名称 3.制作U盘 ...
- c++中深层复制(浅层复制运行错误)成功运行-----sample
下面随笔给出c++中深层复制(浅层复制运行错误)成功运行------sample. 浅层复制与深层复制 浅层复制 实现对象间数据元素的一一对应复制. 深层复制 当被复制的对象数据成员是指针类型时,不是 ...
- POJ-3468(线段树+区间更新+区间查询)
A Simple Problem With Integers POJ-3468 这题是区间更新的模板题,也只是区间更新和区间查询和的简单使用. 代码中需要注意的点我都已经标注出来了,容易搞混的就是up ...
- Linux安全模型中的3A
3A Authentication : 认证 验证用户身份 Authorization : 授权 不同用户设置不同权限 Accouting | Audition : 审计 Linux 验证用户身份 U ...
- Java概述与准备
Java概述 Java语言背景介绍 Java之父:詹姆斯·高斯林(James Gosling) java语言的三个版本: JavaSE: Java 语言的(标准版),用于桌面应用的开发,是其他两个 ...