一、数组操作类:Arrays

最早开始使用,查看方法
二分查找:public static int binarySearch(数据类型[] a, 数据类型 key)
  前提是有序的
  equals
  先排序
  fill
  sort:直接针对对象数据进行排序
  toString(数据类型【】 a)

二、两种比较器的使用:

  Comparable接口、Comparator接口

2.1、Comparable【核心】

方法:public static void sort(Object【】a)

  此方法可以直接对对向数据数组进行排序,并不是意味着直接调用此方法即可,java.lang.ClassCastException: com.lhx.thread.impl.Person1 cannot be cast to java.lang.Comparable

  需要解决对象大小关系问题,然而对象无法区分出大小关系,Java会自动在排序的时候将所有的对象强制转换为Comparable接口

  要想实现对象数组的排序,那么对象所在的类一定要实现Comparable接口  

  1. public interface Comparable<T> {
  2. public int compareTo(T o);
  3. }

  

  String中的CompareTo方法本身就是覆写了Comparable接口中的compareTo(),需要排序返回三个值即可 -1、0、1
示例:

  1. class Person1 implements Comparable<Person1> {
  2. @Override
  3. public int compareTo(Person1 o) {
  4. if(this.age>o.age)
  5. return 1; //升序 -1 降序
  6. else if (this.age<o.age)
  7. return -1;
  8. return 0;
  9. }
  10. }
  11. Arrays.sort(per);

代码简化

  1. class Person1 implements Comparable<Person1> {
  2. @Override
  3. public int compareTo(Person1 o) {
  4. return this.age-o.age //正负数即可
  5. }
  6. }
  7. Arrays.sort(per);

2.2、Comparator挽救的比较器

要想对对象进行排序,那么就要实现Comparable接口,但是有一种情况,一个类原本定义完成了,后期确需要追加排序,并且这个类已经不能修改了。那么这种情况下使用java.util.Compartor

  1. @FunctionalInterface
  2. public interface Comparator<T> {
  3. int compare(T o1, T o2);
  4. boolean equals(Object obj);
  5. }

使用Arrays的public static <T> void sort(T[] a, Comparator<? super T> c)

示例:

  1. class Person3 {
  2. private String name;
  3. private int age;
  4. public Person3(String name , int age){
  5. this.name=name;
  6. this.age=age;
  7. }
  8. //setter,getter
  9. @Override
  10. public String toString() {
  11. return "Person3 [name=" + name + ", age=" + age + "]";
  12. }
  13. }
  14. class PersonComparator implements Comparator<Person3> {
  15. @Override
  16. public int compare(Person3 o1, Person3 o2) {
  17. return o1.getAge()-o2.getAge();
  18. }
  19. }
  20.  
  21. public class TestArrays2 {
  22.  
  23. @Test
  24. public void testMath() {
  25. // Person不能被改变
  26. Person3 per[] =new Person3[]{
  27. new Person3("张三1",65),
  28. new Person3("张三2",12),
  29. new Person3("张三3",16)
  30. };
  31. Arrays.sort(per,new PersonComparator());
  32. System.out.println(Arrays.toString(per));
  33. }
  34. }

简化写法

不用定义比较器类。直接使用时候编写

  1. class Person3 {
  2. private String name;
  3. private int age;
  4. public Person3(String name , int age){
  5. this.name=name;
  6. this.age=age;
  7. }
  8. //setter,getter
  9. @Override
  10. public String toString() {
  11. return "Person3 [name=" + name + ", age=" + age + "]";
  12. }
  13. }
  14. public class TestArrays2 {
  15.  
  16. @Test
  17. public void testMath() {
  18. // Person不能被改变
  19. Person3 per[] =new Person3[]{
  20. new Person3("张三1",65),
  21. new Person3("张三2",12),
  22. new Person3("张三3",16)
  23. };
  24. Arrays.sort(per,new Comparator<Person3 >(){
  25. @Override
  26. public int compare(Person3 o1, Person3 o2) {
  27. return o1.getAge()-o2.getAge();
  28. }
  29. });
  30. System.out.println(Arrays.toString(per));
  31. }
  32. }

请解释两种比较器的区别

1.对象排序过程中有两个Comparable和Comparator
2.java.lang.Comparable是在类定义的时候实现好的接口,使用compareTo
3.java.util.Comparator:需要顶一个排序比较规则类,里面有两个方法compare、equals
开发中优先考虑使用Comparable。

如果要按照升序排序,
则o1 小于o2,返回-1(负数),相等返回0,01大于02返回1(正数)
如果要按照降序排序
 则o1 小于o2,返回1(正数),相等返回0,01大于02返回-1(负数)

示例一、字符串集合排序

  1. public static void main(String args[]){
  2. List<String> list = new ArrayList<>();
  3. list.add("51003");
  4. list.add("510020");
  5. list.add("");
  6. list.add(null);
  7. list.add("510060");
  8. Collections.sort(list,new Comparator<String>() {
  9. @Override
  10. public int compare(String o1, String o2) {
  11. if(o1 == null || o2 == null){
  12. return -1;
  13. }
  14. if(o1.length() > o2.length()){
  15. return 1;
  16. }
  17. if(o1.length() < o2.length()){
  18. return -1;
  19. }
  20. if(o1.compareTo(o2) > 0){
  21. return 1;
  22. }
  23. if(o1.compareTo(o2) < 0){
  24. return -1;
  25. }
  26. if(o1.compareTo(o2) == 0){
  27. return 0;
  28. }
  29. return 0;
  30. }
  31. });
  32. for(String s:list){
  33. System.out.println(s);
  34. }
  35. }

实例二、JSONArray中嵌套JSONObject, 对JSONArray进行排序

排序前:

  1. [{"id":1,"name":"ljw"},{"id":3,"name":"ljw"},{"id":2,"name":"ljw"}]

排序后:

  1. [{"id":1,"name":"ljw"},{"id":2,"name":"ljw"},{"id":3,"name":"ljw"}]

利用Collections.sort()

  1. JSONObject o1 = JSONObject.parseObject("{\"id\":1,\"name\":\"ljw\"}");
  2. JSONObject o2 = JSONObject.parseObject("{\"id\":3,\"name\":\"ljw\"}");
  3. JSONObject o3 = JSONObject.parseObject("{\"id\":2,\"name\":\"ljw\"}");
  4. JSONArray a = new JSONArray();
  5. a.add(o1);
  6. a.add(o2);
  7. a.add(o3);
  8. //转list 1
  9. List<JSONObject> list = JSONArray.parseArray(a.toJSONString(), JSONObject.class);
  10. //转list 2
  11. //List<JSONObject> list = new ArrayList<JSONObject>();
  12. //for (int i = 0; i < a.size(); i++) {
  13. // list.add((JSONObject) a.get(i));
  14. //}
  15. System.out.println("排序前:"+a);
  16. Collections.sort(list, new Comparator<JSONObject>() {
  17. @Override
  18. public int compare(JSONObject o1, JSONObject o2) {
  19. int a = o1.getInteger("id");
  20. int b = o2.getInteger("id");
  21. if (a > b) {
  22. return 1;
  23. } else if(a == b) {
  24. return 0;
  25. } else
  26. return -1;
  27. }
  28. });
  29. JSONArray jsonArray = JSONArray.parseArray(list.toString());
  30. System.out.println("排序后:" + jsonArray);

Java-小技巧-006 List 排序 Collections.sort()的更多相关文章

  1. JAVA对list集合进行排序Collections.sort()

    对一个集合中的对象进行排序,根据对象的某个指标的大小进行升序或降序排序.代码如下: // 进行降序排列 Collections.sort(list, new Comparator<ResultT ...

  2. Java 小技巧和在Java避免NullPonintException的最佳方法(翻译)

                前几天就g+里面看到有人引用这篇博文.看了一下.受益颇多. 所以翻译过来,希望和大家一起学习.本人英语水平有限,假设有错,请大家指正. 原文地址(须要翻墙):http://ja ...

  3. 对List数组进行排序 Collections.sort(param1,param2)

    @SuppressWarnings("unchecked") List<PageData> group_items_list = (List<PageData&g ...

  4. java List 排序 Collections.sort() 对 List 排序

    class User { String name; String age;  public User(String name,String age){  this.name=name;  this.a ...

  5. java List 排序 Collections.sort()

    用Collections.sort方法对list排序有两种方法  第一种是list中的对象实现Comparable接口,如下: /** * 根据order对User排序 */ public class ...

  6. 排序技巧——双关键字排序(快速排序,sort)

    一个萌新的成长之路 Background 在做题过程中,我们常会遇到对双关键字排序的情况,如:当分数相等时,序号小的在前. 这时我们可以通过定义cmp函数作为sort的参数进行排序. Solution ...

  7. ht-8 对arrayList中的自定义对象排序( Collections.sort(List<T> list, Comparator<? super T> c))

    package com.iotek.set; import java.util.ArrayList; import java.util.Collections; import java.util.Co ...

  8. sort()排序 collections.sort();

    1.main方法: public class Test { public static void main(String[] args) { /** * * sort()方法详解 * 1.Collec ...

  9. Java小技巧输出26个英文字母

    相信有的童鞋写到过与字母有关的小东西,是否有写过全部的字母呢?26个这么多字母,一个个打会疯掉.所有咱们可以用一个小技巧使用for循环帮我们把26个字母自动搞出来,大家来瞅一眼把! 使用Java遍历2 ...

随机推荐

  1. 通过编写串口助手工具学习MFC过程——(五)添加CheckBox复选框

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  2. 四:JVM调优原理与常见异常处理方案

    在jvm调优之前,我们必须先了解jvm的内存模型与GC回收机制,这些在我前面的文章里面有介绍!接下来我们通过一个案例来调整jvm性能. 一测试案例: 1.1 编写demo import java.te ...

  3. 剑指offer-平衡二叉树-python

    题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 思路: 平衡二叉树 (AVL)平衡二叉树是一种二叉排序树,其中每个结点的左子树和右子树的高度差至多等于1.它是一种高度平衡的二叉排序树.意思是 ...

  4. 02-Django-views

    # views 视图# 1. 视图概述- 视图即视图函数,接收web请求并返回web响应的事物处理函数.- 响应指符合http协议要求的任何内容,包括json,string, html等 # 2 其他 ...

  5. how to install protobuff python

    当前环境: operate system: Ubuntu 14.04.1 LTS protoc --version: libprotoc 2.5.0    protocol-buffers versi ...

  6. Houdini:也许是你未曾听过的最振奋人心的 CSS 进化

    原文链接:Houdini: Maybe The Most Exciting Development In CSS You’ve Never Heard Of更多译文将陆续推出,欢迎点赞+收藏+关注我的 ...

  7. mailstats - 显示邮件状态信息

    总览 mailstats [-o] [-C cffile] [-f stfile] 描述 mailstats工具显示当前的邮件状态信息. 首先,先显示统计启动时所记录的时间,当然是以ctime(3)所 ...

  8. 十大基本功之testbench

      1. 激励的产生 对于testbench而言,端口应当和被测试的module一一对应.端口分为input,output和inout类型产生激励信号的时候,input对应的端口应当申明为reg, o ...

  9. pymongo操作mongo数据库的查操作

    一:  数据结构 { "_id" : ObjectId("5de8a5b748a75a8d48b72bdc"), ", ", ", ...

  10. vue项目图片路径问题

    一般情况下我们为了能在本地显示效果,写图片路径会直接这样写,但是在实际中图片一般都是动态上传的, 所以,在vue中一般是这样的: 但是这样你会发现,图片根本显示不出来,只是显示了个图片的图标. 后来发 ...