一、引子:想要给ArrayList排序却发现没有排序方法?你有两种选择:

          1、换用TreeSet;

        2、使用Collection.sort(List<T> list) / Collection.sort(List<T> list, Comparator<? super T> c)方法。

二、展开分析Java的几种主要数据结构及其排序方法:

LinkedList 高效操作元素
TreeSet  不重复,有序
HashSet 不重复,快速查找
HashMap  NVP(key不能重复),按Hash算法来存储,取出与存入顺序常常不一致
LinkedHashMap  NVP(key不能重复),可记住元素插入的顺序,取出与存入顺序一致

PS:  HashSet<T>.addAll(ArrayList<T>) 可以这样将所有的元素加进去

三、类型参数与泛型

  在API中常常看见的
                public class ArrayList<E> extends AbstractList<E> {...}
      这里的E会被实际传入的真正类型所取代,这个真正类型也称为类型参数。类ArrayList<E>被称为泛型的类
      同样的,泛型的方法代表着方法声明用到类型参数。有两种运用方式:
      (1)在使用了该类型参数的类中使用     
  public class ArrayList<E> extends AbstractList<E>{
public boolean add( E o){
......
}
}
      (2)在未使用该类型参数的类中使用,但不能将任何东西加入到集合中,只能读及调用方法:
                (在返回类型前加上声明)        
  public <T extends Animal> void takeThing(ArrayList<T> list){
.....
}
             或者使用?              
 public void takeThing(ArrayList<? extends Animal> animals){
.....
}
             需要注意:这和以下代码代表的意思是不一样的:
  public void takeThing(ArrayList<Animal> list){
.....
}
             前者是表示类型参数只要是Animal或其子类就可以而后者只能是Animal
               如果说对后者有了不正确的操作,比如加入了Animal的子类,也只会在运行期间才会被发现。
               在泛型中,extend代表extend或implement

四、使用Collections.sort(List<T> list)方法

      (一)对存放String的ArrayList排序

 ArrayList<String> songList = new ArrayList<String>();
Collections.sort(songList);
      (二)对存放对象的ArrayList排序
                (1)对象需要实现Comparable<E>接口(重写compareTo方法,在里面写上比较逻辑),例:

 public int compareTo( Song s ){
return title.compareTo( s.getTitle() );
}
                (2)步骤与对String排序相同。
 
五、使用Collections.sort(List<T> list, Comparator<? super T> c)方法
      该方法是使用自制的Comparator来帮助排序,以实现更加灵活的排序。
      代码:

  //内部类
class ArtistCompare implements Comparator<Song>{
public int compare(Song one, Song two){
return one.getArtist() . compareTo( two. getArtist());
}
}
ArtistCompare artistCompare = new ArtsitCompare();
Collections.sort(songList, artistCompare);

六、想一想,拿着两个对象,有那么多可以比较的方面,你比那个?所以:你以为对象的比较那么简单?

     hashCode()的默认行为是对堆上的对象产生独特的值。
      equals()的默认行为是执行==的比较。也就是对象字节组合间的比较。
      所以如果你没有重写过以上两个方法,两个对象无论如何都会被认为是不同的。
      下面:引用的相等性和对象的相等性
      1、引用的相等性:引用的是同一个对象,则引用是相等的。
                                    调用hashCode()可以得到相同的结果,hashCode()会根据对象在内存上的位置返回一个专属的序号,该序号是不重复的。
                                    可以用==来判断引用变量是否相等(对象的字节组合);
      2、对象的相等性:如果你想把两个不同的对象视为相等的,必须覆盖从Object继承下来的hashCode()方法与equals()方法。使前者相等,后者返回true(之前提过原因)                但两个对象如果有相同的hashCode也不一定是相等的(存在杂凑算法的碰撞值)。
 
      覆盖的例子:以一首歌的标题来比较歌曲是否是相同:
 class Song implements Comparable<Song>{
private String title;
public boolean equals(Object o){
Song s = (Song) o;
return getTitle().equals(s.getTitle);
}
public int hashCode(){
return getTitle().hashCode();
}
public String getTitle(){
return this.title;
}
}

七、在介绍了上面对象之间如何比较后,还记得开头提到可以提到ArrayList的Treeset么?

  TreeSet的元素必须是(实现了)Comparable 或者 使用重载、取用了Comparator参数的构造函数

       第二种举例:
  

 TreeSet<Book> tree = new TreeSet<Book>(bCompare);  //bCompare是实现了Comparator接口类的一个对象

八、Map键值对的取得方式

1、传统方法1(转成set后取得)

2、传统方法2(转成set后取得)

   3、增强for循环(推荐, jdk1.5以后可使用)

 
             不用iterater,直接迭代以上两种方法取得的set即可。

Java数据结构与排序的更多相关文章

  1. JAVA数据结构--希尔排序

    希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能.这样可以让一个元素可以一次性地朝最终位置前进一大步.然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需 ...

  2. JAVA数据结构--选择排序

    选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然 ...

  3. Java数据结构之排序

    1.冒泡排序:时间复杂度为O(n2) 假设是由小到大排序:相邻两个数之间进行比较,较大的数在后面.一次比较过后最大的数排在最后面 如:40.8.15.18.12一次排序后为:8.15.18.12.40 ...

  4. Java数据结构(排序篇)

    冒泡排序:是经过n-1趟子排序完毕的,第i趟子排序从第1个数至第n-i个数,若第i个数比后一个数大(则升序,小则降序)则交换两数.大泡在上,小泡在下. 选择排序:每一趟从待排序的数据元素中选出最小(或 ...

  5. Java数据结构之排序---希尔排序

    希尔排序的基本介绍: 希尔排序同之前的插入排序一样,它也是一种插入排序,只不过它是简单插入排序之后的一个优化的排序算法,希尔排序也被称为缩小增量排序. 希尔排序的基本思想: 希尔排序是把数组中给定的元 ...

  6. Java数据结构之排序---插入排序

    插入排序的基本介绍: 插入排序是对想要排序的序列以插入的方式寻找该元素的适当的位置,从而达到排序的目的. 插入排序的基本思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时,有序表只有一个元素 ...

  7. Java数据结构之排序---选择排序

    简单选择排序的介绍: 从给定的序列中,按照指定的规则选出某一个元素,再根据规定交换位置后达到有序的目的. 简单选择排序的基本思想: 假定我们的数组为int [] arr = new int[n],第一 ...

  8. Java数据结构之排序---冒泡排序

    冒泡排序的基本思想: 通过对待排序序列从前到后(从下标小的元素开始),依次比较相邻位置的元素的值,若发现与给定的次序冲突,则交换位置(假设数值大的数放在序列的后面),使数值较大的元素逐渐从前移动到后部 ...

  9. Java数据结构与排序算法——堆和堆排序

    //================================================= // File Name : Heap_demo //--------------------- ...

随机推荐

  1. [LeetCode] 面试题59 - II. 队列的最大值

    题目: 分析: 本题要求三个方法的时间复杂度都是O(1),对于push_back和pop_front都是好实现的 但是对于max_value,正常情况下要进行遍历才能获得最大值,那么如何才能在O(1) ...

  2. webapck之多页面打包(常见)

    webpack多入口打包 let path = require('path'); elt HtmlWebpackPlugin = require('html-webpack-plugin'); mod ...

  3. 分享一个基于Net Core 3.1开发的模块化的项目

    先简单介绍下项目(由于重新基于模块化设计了整个项目,所以目前整个项目功能不多) 1.Asp.Net Core 3.1.2+MSSQL2019(LINUX版) 2.中间件涉及Redis.RabbitMQ ...

  4. Go语言中的数据类型转换

    在go语言中,不同类型的变量之间赋值需要显示转换. 语法:T t=T(e) //将i转换为float类型 var j float32=float32(i) 基本数据类型转string 方法1:fmt. ...

  5. Gorm 预加载及输出处理(一)- 预加载应用

    单条关联查询 先创建两个关联模型: // 用户模型 type User struct { gorm.Model Username string `gorm:"type:varchar(20) ...

  6. Ansible-1 基本认识及清单与模块

    ansible 一.常用的自动化运维工具 1.puppet 基于ruby开发,采用c/s架构,扩展性强,基于ssl,远程命令执行相对较弱, 2.saltstack 基于python开发,采用C/S架构 ...

  7. 原来rollup这么简单之 rollup.rollup篇

    大家好,我是小雨小雨,致力于分享有趣的.实用的技术文章. 内容分为翻译和原创,如果有问题,欢迎随时评论或私信,希望和大家一起进步. 分享不易,希望能够得到大家的支持和关注. 计划 rollup系列打算 ...

  8. 《ASP.NET Core 3框架揭秘》5折预售[发布试读章节]

    <ASP.NET Core 3框架揭秘>于昨天在下午京东正式开始预售,并在半天之内销售近一千套.为了回馈读者,出版社与京东谈了一个5折的价格,这是一个连我都没有想到的价格,至少我写着几本书 ...

  9. React笔记1

    目录 1.react基础:类组件.函数式组件.ES5/ES6继承 2.生命周期钩子函数 3.什么是JSX 4.props和state有什么区别 5.路由配置 6.自定义封住组件 7.React 状态管 ...

  10. 读源码 - stagesepx

    目录 背景 一.概述 stagesepx 二.源码中优雅的用法 优雅的赋值/返回 递归方法新建多级目录 更简洁的日志输出 格式化输出的另一种姿势 基于生成器读取多个文件 sorted进阶 入参类型限制 ...