一、基本对象集合排序

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;/*** @Package: PACKAGE_NAME* @ClassName: IntListTest* @Author: tanp* @Description: ${description}* @Date: 2020/9/8 14:42*/
public class IntListTest {public static void main(String[] args) {List<Integer> integerList = new ArrayList<>();Random r = new Random();for(int i=0; i<10; i++){integerList.add(r.nextInt(100));}System.out.println(integerList);Collections.sort(integerList);System.out.println(integerList);}}

从上面的代码里我们可以看出,对于基本类型的数据我们可以直接调用Collections.sort();方法即可,但是对于我们自定的对象呢,如何排序呢

二、自定义对象集合排序

自定义对象集合排序有两种方法

1.自定义一个Comparator比较器

compare()方法用来给两个输入参数排序,返回负数,0,正数,表明第一个参数是小于,等于,大于第二个参数

import java.util.*;/*** @ClassName: Dog* @Author: tanp* @Description: ${description}* @Date: 2020/9/7 17:29*/
public class Dog {private String name;private int length;private int weight;public Dog(String name, int length, int weight) {this.name = name;this.length = length;this.weight = weight;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getLength() {return length;}public void setLength(int length) {this.length = length;}public int getWeight() {return weight;}public void setWeight(int weight) {this.weight = weight;}@Overridepublic String toString() {return "Dog{" +"name='" + name + '\'' +", length=" + length +", weight=" + weight +'}';}public static void main(String[] args) {List<Dog> dogs = new ArrayList<>();Random r =new Random();for (int i = 0; i < 5; i++) {dogs.add(new Dog("dog"+i,r.nextInt(100), r.nextInt(100)));}System.out.println(dogs);//直接调用sort会出现编译错误,因为Dog有各种属性//到底按照哪种属性进行比较,Collections也不知道,不确定,所以没法排//Collections.sort(dogs);//引入Comparator,指定比较的算法Comparator<Dog> c = new Comparator<Dog>() {@Overridepublic int compare(Dog dog1, Dog dog2) {//按照hp进行排序if(dog1.weight>=dog2.weight){//正数表示h1比h2要大return 1;}else{return -1;}}};Collections.sort(dogs,c);System.out.println("按体重排序后的集合:");System.out.println(dogs);}
}

2.实现Comparable接口

Comparable接口里的compareTo()方法,可以个给两个对象排序。具体来说,它返回负数,0,正数,来表明已经存在的对象小于,等于,大于输入对象。

import java.util.*;/*** @Package: PACKAGE_NAME* @ClassName: Dog1* @Author: tanp* @Description: ${description}* @Date: 2020/9/7 17:59*/
public class Dog1 implements Comparable<Dog1> {private String name;private int length;private int weight;public Dog1(String name, int length, int weight) {this.name = name;this.length = length;this.weight = weight;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getLength() {return length;}public void setLength(int length) {this.length = length;}public int getWeight() {return weight;}public void setWeight(int weight) {this.weight = weight;}@Overridepublic String toString() {return "Dog1{" +"name='" + name + '\'' +", length=" + length +", weight=" + weight +'}';}@Overridepublic int compareTo(Dog1 dog1) {if (weight > dog1.weight) {return 1;} else {return -1;}}public static void main(String[] args) {List<Dog1> dogs = new ArrayList<>();Random r =new Random();for (int i = 0; i < 5; i++) {dogs.add(new Dog1("dog"+i,r.nextInt(100), r.nextInt(100)));}System.out.println(dogs);//重写了比较方法可直接调用比较方法Collections.sort(dogs);System.out.println("按体重排序后的集合:");System.out.println(dogs);}
}

三、Comparator 和 Comparable 的区别

Comparable 定义在自定义对象类的内部,且已经实现了比较器,所以对于自定义对象而言,它现在是一个可以比较大小的对象了,它的比较功能和String完全一样,可以随时随地的拿来。Comparator 是定义在自定义对象的外部的, 此时我们的自定义对象类的类结构不需要有任何变化。

总的来说,使用Comparable方式比较时,我们将比较的规则写入了比较的类型中,其特点是高内聚。但如果哪天这个规则需要修改,那么我们必须修改这个类型的源代码。如果使用Comparator方式比较,那么我们不需要修改比较的类,其特点是易维护,但需要自定义一个比较器,后续比较规则的修改,仅仅是改这个比较器中的代码即可。

java自定义对象集合排序相关推荐

  1. Java基础-TreeSet与Java自定义类型的排序

    TreeSet与Java自定义类型的排序 演示TreeSet对String是可排序的 TreeSet无法对自定义类型进行排序 比较规则怎么写 自平衡二叉树结构 实现比较器接口 Collections工 ...

  2. java arraylist comparable_Java 两种ArrayList集合自定义对象属性排序,Comparator接口 或 Comparable接口...

    1,Comparator接口 -- 重写Comparator public class User { private String id; private String name; public Us ...

  3. .NET/C#中对自定义对象集合进行自定义排序的方法

    一个集合可否排序,要看系统知不知道排序的规则,像内建的系统类型,int ,string,short,decimal这些,系统知道怎么排序,而如果一个集合里面放置的是自定义类型,比如自己定义了一个Car ...

  4. Java匿名对象集合随机数

    常用的API: 应用程序编程接口,程序员字典,好多类,好多方法,jdk提供好的现成的类1.6版本简体中文版包路径-----构造方法-----方法摘要 Scanner: 引用类型 导包--创建--使用可 ...

  5. Java实现对象列表排序

    Java实现多个对象排序(两种方式) 如果是Java自定义的对象,需要对多个对象进行排序,这里使用Java自身提供的排序函数Collections.sort();但是我们的对象需要支持这个函数,需要做 ...

  6. aquarius Java自定义对象池

    背景说明 上周五在项目里码代码时遇到一个需求,需要开启一个DatagramSocket端口去接收数据. 开始用的内部类的单例模式,后来觉得一个端口不得劲,就创建了多个DatagramSocket实例端 ...

  7. java 自定义对象 排序,使用自定义排序顺序对对象的ArrayList进行排序

    问题 我希望为我的地址簿应用程序实现一个排序功能. 我想排序anArrayList contactArray.Contact是一个包含四个字段的类:名称,家庭电话号码,手机号码和地址.我想排序name ...

  8. 使用 Java Stream 实现集合排序

    排序集合中的对象 1.源码介绍 1.1 Stream sorted() 源码查看: /*** Returns a stream consisting of the elements of this s ...

  9. java中对集合排序,Java如何对集合中的项目排序?

    整理一个诀窍java.util.Set是使用的执行java.util.SortedSet,如java.util.TreeSet类.下面的示例向您显示使用java.util.TreeSet该类的结果,其 ...

  10. Java提取对象集合的某些属性生成新集合

    文章目录 一.准备工作 二.操作实例 有时候在对List集合操作时并不想新建一个实体类来进行转换.这就涉及到将集合中对象的每个元素投影到新属性,以此来生成一个新的集合. 一.准备工作 定义实体类Use ...

最新文章

  1. 蒟蒻的第一篇博客CF1041C Coffee Break(二分+贪心+set)
  2. IP-Address TextBox
  3. FreeBSD下安装配置Hadoop集群(四)
  4. vue-router 的重定向-redirect
  5. JCO 自定义DestinationDataProvider
  6. java 调试 工具_Java调试器–权威的工具列表
  7. 华为鸿蒙os系统转正,华为鸿蒙OS系统正式官宣,转正工作提上日程,明年多款终端将使用...
  8. iOS CoreImage之滤镜简单使用
  9. LAMP兄弟连打造免费视频教程
  10. Android 性能测试之方向与框架篇
  11. 游戏文件系统(a11s)
  12. 战术导弹飞行控制系统设计
  13. 程序员为什么更容易掉头发?
  14. css和html写个人网站,手把手教用你DIV和CSS建个人网站
  15. Intel显卡跑ROS与CUDA总结(MacBook Pro 11.6.3)
  16. 可编程式坐标--单位圆坐标
  17. tkinter电子木鱼
  18. rn+android+sdk,RN与Android原生交互
  19. 计算机网络技术(五)——网络互联技术
  20. 3.python数据分析处理库pandas(学习笔记)

热门文章

  1. idea 因破解而无法打开的问题
  2. ET代理_切换ip软件网络功能。
  3. 盘点 常见MQ : 消息队列总览
  4. MATLAB线性规划整数变量,Matlab 整数线性规划问题模型代码
  5. 今天使用overleaf生成个人简历
  6. 计算机网络中sep是什么意思,SEP系统介绍及实施方案介绍.ppt
  7. apt 安装软件出现“无法定位软件包”的问题
  8. CRT使用(二)CRT软件修改超时时间
  9. 服务器CRT显示不全,CRT显示器显示画面不正常常见原因揭密
  10. java设置窗体图标_在java中怎么设置窗体的图标?详细步骤图解