目录

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底层实现的更多相关文章

  1. Java基础-引用数据类型之集合(Collection)

    Java基础-引用数据类型之集合(Collection) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么出现集合类 面向对象语言对事物的体现都是以对象的形式,所以为了方便 ...

  2. java基础-引用数据类型之一维数组(Array)

    java基础-引用数据类型之一维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组的定义 1>.为什么需要数组 保存一个数据可以定义一个变量,如果要保 ...

  3. java的引用数据类型,你知道吗???

    有些人很清楚java的八种基本数据类型,但说到java的引用数据类型就不清楚了. Java的数据类型分为两大类,即基本数据类型和引用数据类型,在基本数据类型中有8种 基本数据类型(逻辑型-boolea ...

  4. java基础-引用数据类型之二维数组(Array)

    java基础-引用数据类型之二维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我们学习过了Java的一维数组,所谓的二维数组就是元素是一堆一维数组的数组,换 ...

  5. Java改变引用数据类型的值

    Java改变引用数据类型的值 在Java中,引用数据类型的数据传递的是值(地址)的拷贝 对于以下代码 class BirthDate { private int day; private int mo ...

  6. Java 基础 引用数据类型 ArrayList集合

    引用数据类型(类) 分类 提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类. 我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner类, ...

  7. Java 基础 引用数据类型 和 流程控制

    引用数据类型 与定义基本数据类型变量不同,引用数据类型的变量定义及复制有一个相对固定的步骤和格式: 数据类型 变量名 = new 数据类型(); 如:String st = new String(); ...

  8. java 使用 引用数据类型(以Scanner、Random模块为例)

    创建一个新变量 类型 变量名 = new 类型() 举个例子: Scanner sc = new Scaner() 使用引用数据类型中的功能: 变量.功能名字() Scanner类:接受键盘输入 1. ...

  9. Java 容器源码分析之 TreeMap

    TreeMap 是一种基于红黑树实现的 Key-Value 结构.在使用集合视图在 HashMap 中迭代时,是不能保证迭代顺序的: LinkedHashMap 使用了双向链表,保证按照插入顺序或者访 ...

随机推荐

  1. mac 上 sublime text2 快捷键

    打开/前往: ⌘T 前往文件 ⌘⌃P 前往项目⌘R 前往 method⌘⇧P 命令提示⌃G 前往行⌃ ` python 控制台 编辑:⌘L 选择行 (重复按下将下一行加入选择)⌘D 选择词 (重复按下 ...

  2. Ubuntu下安装Python3.6并在终端输入Python就能显示Python3.6

      Ubuntu17.04自带Python2.7与Python3.5.3的版本,由于Python2与Python3有着一些差距可能需要安装更新Python3的版本,并且切换默认的Python解释器. ...

  3. 自定义事件的触发dispatchEvent

    1. 对于标准浏览器,其提供了可供元素触发的方法:element.dispatchEvent(). 不过,在使用该方法之前,我们还需要做其他两件事,及创建和初始化.因此,总结说来就是: documen ...

  4. 一张图解AlphaGo原理及弱点

    声明:本文转载自(微信公众号:CKDD),作者郑宇 张钧波,仅作学习收录之用,不做商业目的. 近期AlphaGo在人机围棋比赛中连胜李世石3局,体现了人工智能在围棋领域的突破,作为人工智能领域的工作者 ...

  5. AC日记——小A和uim之大逃离 II 洛谷七月月赛

    小A和uim之大逃离 II 思路: spfa: 代码: #include <bits/stdc++.h> using namespace std; #define INF 0x3f3f3f ...

  6. bzoj 1818 主席树

    思路:主席树搞一搞. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #de ...

  7. Codeforces Round #222 (Div. 1) 博弈 + dp

    一般这种要倒着来. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #def ...

  8. 11.Spark Streaming源码解读之Driver中的ReceiverTracker架构设计以及具体实现彻底研究

    上篇文章详细解析了Receiver不断接收数据的过程,在Receiver接收数据的过程中会将数据的元信息发送给ReceiverTracker:   本文将详细解析ReceiverTracker的的架构 ...

  9. 【C#】Unicode的流言终结者和编码大揭秘

    如果你是一个生活在2003年的程序员,却不了解字符.字符集.编码和Unicode这些基础知识.那你可要小心了,要是被我抓到你,我会让你在潜水艇里剥六个月洋葱来惩罚你. 这个邪恶的恐吓是Joel Spo ...

  10. scrollview和viewpager滑动冲突

    import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; i ...