一、数组操作类: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接口  

public interface Comparable<T> {
public int compareTo(T o);
}

  

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

class Person1 implements Comparable<Person1> {
@Override
public int compareTo(Person1 o) {
if(this.age>o.age)
return 1; //升序 -1 降序
else if (this.age<o.age)
return -1;
return 0;
}
}
Arrays.sort(per);

代码简化

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

2.2、Comparator挽救的比较器

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

@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}

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

示例:

class Person3 {
private String name;
private int age;
public Person3(String name , int age){
this.name=name;
this.age=age;
}
//setter,getter
@Override
public String toString() {
return "Person3 [name=" + name + ", age=" + age + "]";
}
}
class PersonComparator implements Comparator<Person3> {
@Override
public int compare(Person3 o1, Person3 o2) {
return o1.getAge()-o2.getAge();
}
} public class TestArrays2 { @Test
public void testMath() {
// Person不能被改变
Person3 per[] =new Person3[]{
new Person3("张三1",65),
new Person3("张三2",12),
new Person3("张三3",16)
};
Arrays.sort(per,new PersonComparator());
System.out.println(Arrays.toString(per));
}
}

简化写法

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

class Person3 {
private String name;
private int age;
public Person3(String name , int age){
this.name=name;
this.age=age;
}
//setter,getter
@Override
public String toString() {
return "Person3 [name=" + name + ", age=" + age + "]";
}
}
public class TestArrays2 { @Test
public void testMath() {
// Person不能被改变
Person3 per[] =new Person3[]{
new Person3("张三1",65),
new Person3("张三2",12),
new Person3("张三3",16)
};
Arrays.sort(per,new Comparator<Person3 >(){
@Override
public int compare(Person3 o1, Person3 o2) {
return o1.getAge()-o2.getAge();
}
});
System.out.println(Arrays.toString(per));
}
}

请解释两种比较器的区别

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(负数)

示例一、字符串集合排序

    public static void main(String args[]){
List<String> list = new ArrayList<>();
list.add("51003");
list.add("510020");
list.add("");
list.add(null);
list.add("510060");
Collections.sort(list,new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1 == null || o2 == null){
return -1;
}
if(o1.length() > o2.length()){
return 1;
}
if(o1.length() < o2.length()){
return -1;
}
if(o1.compareTo(o2) > 0){
return 1;
}
if(o1.compareTo(o2) < 0){
return -1;
}
if(o1.compareTo(o2) == 0){
return 0;
}
return 0;
}
});
for(String s:list){
System.out.println(s);
}
}

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

排序前:

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

排序后:

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

利用Collections.sort()

JSONObject o1 = JSONObject.parseObject("{\"id\":1,\"name\":\"ljw\"}");
JSONObject o2 = JSONObject.parseObject("{\"id\":3,\"name\":\"ljw\"}");
JSONObject o3 = JSONObject.parseObject("{\"id\":2,\"name\":\"ljw\"}");
JSONArray a = new JSONArray();
a.add(o1);
a.add(o2);
a.add(o3);
//转list 1
List<JSONObject> list = JSONArray.parseArray(a.toJSONString(), JSONObject.class);
//转list 2
//List<JSONObject> list = new ArrayList<JSONObject>();
//for (int i = 0; i < a.size(); i++) {
// list.add((JSONObject) a.get(i));
//}
System.out.println("排序前:"+a);
Collections.sort(list, new Comparator<JSONObject>() {
@Override
public int compare(JSONObject o1, JSONObject o2) {
int a = o1.getInteger("id");
int b = o2.getInteger("id");
if (a > b) {
return 1;
} else if(a == b) {
return 0;
} else
return -1;
}
});
JSONArray jsonArray = JSONArray.parseArray(list.toString());
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. Django、Flask、Tornado的区别?

    Django:Python 界最全能的 web 开发框架,battery-include 各种功能完备,可维护性和开发速度一级棒.常有人说 Django 慢,其实主要慢在 Django ORM 与数据 ...

  2. spring boot 枚举使用的坑2

    上一篇说到在枚举当在controller的方法做参数时的坑,解决方法是配置了一个converter,后来想想,如果不闲每次都加一个注解麻烦的话,可以在参数前面加一个注解,添加一个解析器应该也可以解决这 ...

  3. 锋利的jQuery ——jQuery中的事件和动画(四)

    一.jQuery中的事件 1)加载DOM $(document).ready()和window.onload的区别 1>执行时机 $(document).ready(){}  方法内注册的事件, ...

  4. 自动布局(storyboard,code)

    xcode 6使用storyboard 进行自动布局,迷惑的问题主要由: 1,classsize 到底是一个什么东东? 2,classSize 和 layout 有什么区别? 3,  如何使用stor ...

  5. DRF之三大认证

    一.用户认证Authorticatons 1.源码解析 第一步. 找入口 def dispatch(self, request, *args, **kwargs): # 1.首先我们进入的是APIVi ...

  6. 在Linux环境下部署MySql服务

    之前有下载部署过几次,但是每次都会踩一些坑.特此记录在liunx下部署安装mysql的基本步骤: 1.卸载老版本的mysql find / -name mysql|xargs rm -rf     查 ...

  7. 019-openstack组件使用的默认端口号

    一.OpenStack组件使用的默认端口号 openstack openstack service default ports port type keystone Identity service ...

  8. Codeforces 954 dijsktra 离散化矩阵快速幂DP 前缀和二分check

    A B C D 给你一个联通图 给定S,T 要求你加一条边使得ST的最短距离不会减少 问你有多少种方法 因为N<=1000 所以N^2枚举边数 迪杰斯特拉两次 求出Sdis 和 Tdis 如果d ...

  9. macos升级Nodejs和Npm到最新版

    第一步,先查看本机node.js版本: node -v 第二步,清除node.js的cache: sudo npm cache clean -f 第三步,安装 n 工具,这个工具是专门用来管理node ...

  10. CSS居中完全指南——构建CSS居中决策树

    CSS居中完全指南--构建CSS居中决策树 本文总结CSS居中,包括水平居中和垂直居中.本文相当于CSS决策树,下次再遇到CSS居中问题时有章可循. 参考Centering in CSS: A Com ...