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 使用了双向链表,保证按照插入顺序或者访 ...
随机推荐
- python安装模块的时候报错error: command 'gcc' failed with exit status 1
[情况] 在写Python代码的时候,需要用到psutil模块,需要安装. 但是在安装时,报错:error: command 'gcc' failed with exit status 1 [解决步骤 ...
- Python语言库pyttsx3
这是一个文字转语音的python模块. 1. macos下安装的时候出现问题: 后来发现,Foundation, AppKit, PyObjCTools都不存在,主要原因是缺少依赖模块pyobjc, ...
- cgi与html相互调用
html中调用cgi.<form action="/cgi-bin/mult.cgi" method="get" target="_blank& ...
- 解决IDEA导入Myclipse项目的时候没有识别为Web项目的问题
IDEA在导入一个MyEclipse新建的Web项目的时候,一般会正确检测这个项目是什么项目.不过有时候会出现各种问题. 1. 出现一些Jar包不存在的问题,一般是servlet-api这样的包不存在 ...
- initialization 与 finalization 执行顺序 研究
看GIF: 第二个GIF: DEMO下载:http://files.cnblogs.com/files/del88/InitOrderDemo.zip
- Codeforces 799B - T-shirt buying(STL)
题目链接:http://codeforces.com/problemset/problem/799/B 题目大意:有n件T恤,每件T体恤都分别有价格(每件衣服的价格不重复).前面的颜色.背部的颜色三种 ...
- 推荐一个数据相关的网站tushare
推荐一个网站:tushare 使用方法如下: pip install tushare 我是使用pycharm直接安装的 抓取了浦发和光大的股票数据,并通过csv进行保存,和通过plt进行图片打印 im ...
- linux抓包工具tcpdump基本使用
tcpdump 是一款灵活.功能强大的抓包工具,能有效地帮助排查网络故障问题. tcpdump 是一个命令行实用工具,允许你抓取和分析经过系统的流量数据包.它通常被用作于网络故障分析工具以及安全工具. ...
- zabbix 监控 oracle 数据库
https://blog.csdn.net/dyllove98/article/details/41120853
- day2 列表中常用的方法
列表中有很多方法,下面来看看常用的方法,我们知道,字符串是以字符列表形式存储的.因此上面学习的字符串中的很多方法在列表中也有. 1.extend() extend()列表的扩展,把两个列表进行 ...