Java容器-引用数据类型排序+TreeSet、TreeMap底层实现
目录
1、冒泡排序的实现
2、比较接口(普通数据类型、引用数据类型)
普通数据类型:冒泡排序
引用数据类型:包装类(Integer、String、Character、Date)
自定义类型:实体类:implements Comparable+compareTo|业务排序类:获取comparator对象、compare方法
3、TreeSet、TreeMap的使用
代码实现
1、冒泡排序(只演示升序)
//采用泛型进行升序排列
public static <T extends Comparable<T>>void sort(T [] arry) {
boolean sorted = true;
for (int j = 0; j < arry.length - 1; j++) {
sorted = true;
for (int i = 0; i < arry.length - 1; i++) {
if (((Comparable) arry[i]).compareTo(arry[i + 1]) > 0) {
T temp = arry[i];
arry[i] = arry[i + 1];
arry[i + 1] = temp;
//有数据交换就顺序是乱的
sorted = false;
}
}
//如之前没有进行交换就说明有序即不用交换
if (sorted) {
break;
}
}
}
2、引用类型
(1)实体类:Comparable+compareTo
//比较引用对象的大小
public static void main(){
//Integer:根据数据类型的大小比较
System.out.println((Integer)10-(Integer)5);
//Charaacter:根据Unicode吗比较大小
Character c1='a';
Character c2='c';
System.out.println(c2-c1);
//String:如果str1("abc")是str2("abcd")的子串,则返回字符串长度之差;否则,根据第一个不同的字符的unicode码之差。
System.out.println("abc".compareTo("abcd"));
//Date:根据毫秒数之差比较
System.out.println(new Date(System.currentTimeMillis()-60*60*1000).compareTo(new Date()));
}
//实现对包装类的排序
public static <T extends Comparable<T>>void sort(T [] arry) {
boolean sorted = true;
for (int j = 0; j < arry.length - 1; j++) {
sorted = true;
for (int i = 0; i < arry.length - 1; i++) {
if (((Comparable) arry[i]).compareTo(arry[i + 1]) > 0) {
T temp = arry[i];
arry[i] = arry[i + 1];
arry[i + 1] = temp;
//有数据交换就顺序是乱的
sorted = false;
}
}
//如之前没有进行交换就说明有序即不用交换
if (sorted) {
break;
}
}
}
(2)业务排序类:持有Comparator+实现compare接口
//利用Comparator实现升序
public static <T extends Comparator<T>>void sort(Object [] arry, Comparator comparator) {
boolean sorted = true;
for (int j = 0; j < arry.length - 1; j++) {
sorted = true;
for (int i = 0; i < arry.length - 1; i++) {
if ((comparator.compare(arry[i],arry[i + 1]))> 0) {
Object temp = arry[i];
arry[i] = arry[i + 1];
arry[i + 1] = temp;
//有数据交换就顺序是乱的
sorted = false;
}
}
//如之前没有进行交换就说明有序即不用交换
if (sorted) {
break;
}
}
}
(3)应用类型实现排序
String [] arrStr=new String[]{"ab","a","abc"};
SortUtils.sort(arrStr,new StringConparator());
System.out.println(Arrays.toString(arrStr));
//结果:[a,ab,abc] //此处模拟:根据字符串长度进行比较
public class StringConparator implements java.util.Comparator<String> {
public int compare(String o1, String o2) {
return o1.length()-o2.length()>0?1:o1.length()-o2.length()==0?0:-1;
}
}
(4)TreeSet、TreeMap(底层实现:通过上述两种方式来比较对象,从而实现排序)
说明1:无参构造器默认用Comparable+compareTo方式实现、有参构造器需要传Comparator+compare
说明2:当add元素的时候,就进行排序。所以不可修改,set以后,依然不改变顺序。所以建议把元素设置成final
public TreeMap(Comparator<? super K> comparator);
public static void main(String [] args){
TreeSet treeSet=new TreeSet();
treeSet.add("ab");
treeSet.add("a");
treeSet.add("abc");
for(Object s:treeSet){
System.out.println(s);
}
}
Java容器-引用数据类型排序+TreeSet、TreeMap底层实现的更多相关文章
- Java基础-引用数据类型之集合(Collection)
Java基础-引用数据类型之集合(Collection) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么出现集合类 面向对象语言对事物的体现都是以对象的形式,所以为了方便 ...
- java基础-引用数据类型之一维数组(Array)
java基础-引用数据类型之一维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组的定义 1>.为什么需要数组 保存一个数据可以定义一个变量,如果要保 ...
- java的引用数据类型,你知道吗???
有些人很清楚java的八种基本数据类型,但说到java的引用数据类型就不清楚了. Java的数据类型分为两大类,即基本数据类型和引用数据类型,在基本数据类型中有8种 基本数据类型(逻辑型-boolea ...
- java基础-引用数据类型之二维数组(Array)
java基础-引用数据类型之二维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我们学习过了Java的一维数组,所谓的二维数组就是元素是一堆一维数组的数组,换 ...
- Java改变引用数据类型的值
Java改变引用数据类型的值 在Java中,引用数据类型的数据传递的是值(地址)的拷贝 对于以下代码 class BirthDate { private int day; private int mo ...
- Java 基础 引用数据类型 ArrayList集合
引用数据类型(类) 分类 提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类. 我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner类, ...
- Java 基础 引用数据类型 和 流程控制
引用数据类型 与定义基本数据类型变量不同,引用数据类型的变量定义及复制有一个相对固定的步骤和格式: 数据类型 变量名 = new 数据类型(); 如:String st = new String(); ...
- java 使用 引用数据类型(以Scanner、Random模块为例)
创建一个新变量 类型 变量名 = new 类型() 举个例子: Scanner sc = new Scaner() 使用引用数据类型中的功能: 变量.功能名字() Scanner类:接受键盘输入 1. ...
- Java 容器源码分析之 TreeMap
TreeMap 是一种基于红黑树实现的 Key-Value 结构.在使用集合视图在 HashMap 中迭代时,是不能保证迭代顺序的: LinkedHashMap 使用了双向链表,保证按照插入顺序或者访 ...
随机推荐
- tyvj P1050 最长公共子序列
题目链接:http://tyvj.cn/p/1050 题解: 裸题,只是为了测试LCS模板写对没有…… #include<cstdio> #include<cstring> # ...
- html---规范、细节积累-01
语义错误 块级元素可以包含内联元素和某些块级元素,内联元素不能包含块级元素,只能包含内联元素 页面可能正常解析,但不符合语义.浏览器自带容错机制,对于不规范的写法也能够正确解析,各浏览器的容错机制不同 ...
- Android检测富文本中的<img标签并实现点击效果
本文旨在:通过点击一张图片Toast输出位置与url链接. 闲话少说,实现原理大概是酱紫的::通过正则表达式检测富文本内的图片集合并获取url,在src=“xxx” 后面添加 onclick方法,至于 ...
- Ubuntu下Hadoop的安装和配置
最近又需要要搭hadoop环境,所以开始学习,下面是我的笔记,仅供大家参考! Hadoop安装: JDK1.6+ 操作系统:Linux,Window和Unix也可以做Hadoop的开发,只有Linux ...
- python【项目】:基于socket的FTP服务器
功能要求 1. 用户加密认证 2. 服务端采用 SocketServer实现,支持多客户端连接 3. 每个用户有自己的家目录且只能访问自己的家目录 4. 对用户进行磁盘配额.不同用户配额可不同 5. ...
- webpack编译时No PostCSS Config的解决方法
1. { loader:"postcss-loader", options: { // 如果没有options这个选项将会报错 No PostCSS Config found pl ...
- Windows内核分析——内核调试机制的实现(NtCreateDebugObject、DbgkpPostFakeProcessCreateMessages、DbgkpPostFakeThreadMessages分析)
本文主要分析内核中与调试相关的几个内核函数. 首先是NtCreateDebugObject函数,用于创建一个内核调试对象,分析程序可知,其实只是一层对ObCreateObject的封装,并初始化一些结 ...
- Roman to Integer & Integer to Roman
题目: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from ...
- Redis实战(六)
查询数据 1.使用Linq匹配关键字查询 using (var redisClient = RedisManager.GetClient()) { var user = redisClient.Get ...
- 很好的开源UI框架Chico UI
介绍一个很好的开源的UI框架,依赖于jquery 官网:http://www.chico-ui.com.ar/ 以下是相关截图: 消息提示 自动完成 分页,列表 Chico UI是什么? Chico ...