1.定义自己的 MyComparable 接口

1 package Test.treeSetDemo;
2
3 public interface MyComparable <E>{
4 int compareTo(E e);
5 }

2.定义自己的 MyComparator接口

1 package Test.treeSetDemo;
2
3 public interface MyComparator {
4 int compare(Student student1,Student student2);
5 }

3.定义自己的排序类

 1 package Test.treeSetDemo;
2
3 import java.util.ArrayList;
4 import java.util.Comparator;
5
6 public class MyArray {
7 private ArrayList <Student> students = new ArrayList<>();
8 /*
9 1.直接排序 实现对象的排序
10 缺点:1.只能根据年龄排序
11 2.只能排一种顺序 无法先年龄后身高
12 */
13 public void sort(){
14 //使用冒泡排序比较年龄 排ArrayList中的对象
15 for (int i = 0; i < students.size(); i++) {
16 for (int j = 0; j < students.size()-1; j++) {
17 Student current = students.get(j);
18 Student next = students.get(j + 1);
19 if (current.getAge()>next.getAge()){
20 Student temp = current;
21 students.set(j,next);
22 students.set(j+1,temp);
23 }
24 }
25 }
26 }
27
28 /*
29 2.让对象可比 即对象实现comparable
30 */
31 public void sort2(){
32 //使用冒泡排序比较年龄 排ArrayList中的对象
33 for (int i = 0; i < students.size(); i++) {
34 for (int j = 0; j < students.size()-1; j++) {
35 Student current = students.get(j);
36 Student next = students.get(j + 1);
37 if (current.compareTo(next)>0){
38 Student temp = current;
39 students.set(j,next);
40 students.set(j+1,temp);
41 }
42 }
43 }
44 }
45 /*
46 3.传入一个比较器对象
47 */
48 public void sort2(MyComparator comparator){
49 //使用冒泡排序比较年龄 排ArrayList中的对象
50 for (int i = 0; i < students.size(); i++) {
51 for (int j = 0; j < students.size()-1; j++) {
52 Student current = students.get(j);
53 Student next = students.get(j + 1);
54 int result=comparator.compare(current,next);
55 //要实现排序 if 这儿的boolean结果是个关键 而求boolean的这个过程不一定非要在自己类中实现
56 if (result>0){
57 Student temp = current;
58 students.set(j,next);
59 students.set(j+1,temp);
60 }
61 }
62 }
63 }
64
65 public ArrayList<Student> getStudents() {
66 return students;
67 }
68 public void setStudents(ArrayList<Student> students) {
69 this.students = students;
70 }
71 }

4.定义对象的类

 1 package Test.treeSetDemo;
2
3 class Student implements MyComparable<Student>{
4 private String name;
5 private int age;
6 private int height;
7
8 public String getName() {
9 return name;
10 }
11
12 public void setName(String name) {
13 this.name = name;
14 }
15
16 public int getAge() {
17 return age;
18 }
19
20 public void setAge(int age) {
21 this.age = age;
22 }
23
24 public Student() {
25 }
26
27 public Student(String name, int age) {
28 this.name = name;
29 this.age = age;
30 }
31
32 @Override
33 public int compareTo(Student o) {
34 int result=this.age -o .age;
35 return result;
36 }
37
38 @Override
39 public String toString() {
40 return "Student{" +
41 "name='" + name + '\'' +
42 ", age=" + age +
43 ", height=" + height +
44 '}';
45 }
46
47 public Student(String name, int age, int height) {
48 this.name = name;
49 this.age = age;
50 this.height = height;
51 }
52
53 public int getHeight() {
54 return height;
55 }
56
57 public void setHeight(int height) {
58 this.height = height;
59 }
60 }

5.测试

 1 package Test.treeSetDemo;
2
3 import java.util.ArrayList;
4
5 public class Test {
6 public static void main(String[] args) {
7 MyArray myArray = new MyArray();
8 ArrayList<Student> students = myArray.getStudents();
9 students.add(new Student("aaa", 111,175));
10 students.add(new Student("bbb", 102,180));
11 students.add(new Student("ccc", 195,182));
12 students.add(new Student("ddd", 333,179));
13 students.add(new Student("eee", 111,180));
14 // 1.直接排序 实现对象的排序
15 myArray.sort();
16 for (Student student : students) {
17 System.out.println(student);
18 }
19 System.out.println("------------------------------------");
20 // 2.让对象可比 即对象实现comparable
21 myArray.sort2();
22 for (Student student : students) {
23 System.out.println(student);
24 }
25 System.out.println("------------------------------------");
26 //3.传入一个比较器对象
27 myArray.sort2(new MyComparator() {
28 @Override
29 public int compare(Student student1, Student student2) {
30 int result=student1.getHeight()-student2.getHeight();//先比身高 升序
31 result= result==0?student2.getAge()-student1.getAge():result;//后比年龄 降序
32 return result;
33 }
34 });
35 for (Student student : students) {
36 System.out.println(student);
37 }
38 }
39 }

对象数组排序 和 类比JDK实现 sort()的方法的更多相关文章

  1. 37-Arrays.sort() 由大到小排序 和 对象数组排序

    1. 由大到小排序: 2. 对象数组排序: 1. 由大到小排序: 注意:必需是Integer 类型的数组!!! 方法一: import java.util.Arrays; import java.ut ...

  2. javascript 对象数组排序(按照科目级次)

    需求 从后台获取的数据是这样的                  上帝要这样的 背景 从后台获取到表格数据,然后填充到excel.当然是用js来填充的.js 本身的数组具有sort()功能.但是是针对 ...

  3. 关于Collections.sort()排序方法的源码探索

    /**下面在自己代码中使用Collections.sort()方法去比较Student对象,通过在自己写的类里面通过匿名内部类实现Comparator接口,这个接口是让你自己实现比较器的规则*/ // ...

  4. JVM 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析

    转自:https://blog.csdn.net/tjiyu/article/details/53982412 1-1.为什么需要了解垃圾回收 目前内存的动态分配与内存回收技术已经相当成熟,但为什么还 ...

  5. @NamedEntityGraphs --JPA按实体类对象参数中的字段排序问题得解决方法

    JPA按实体类对象参数中的字段排序问题得解决方法@Entity @Table(name="complaints") @NamedEntityGraphs({ @NamedEntit ...

  6. Java 对象的哈希值是每次 hashCode() 方法调用重计算么?

    对于没有覆盖hashCode()方法的对象 如果没有覆盖 hashCode() 方法,那么哈希值为底层 JDK C++ 源码实现,实例每次调用hashcode()方法,只有第一次计算哈希值,之后哈希值 ...

  7. hibernate中保存一个对象后再设置此对象的属性为什么不需要调用update方法了

    hibernate中保存一个对象后再设置此对象的属性为什么不需要调用update方法了 例如session.save(user);user.setAge(20); 原因: hibernate对象的三种 ...

  8. jdk环境变量配置方法

    jdk环境变量配置方法: 在安装完jdk后,还需要对jdk的环境变量进行配置才能正常使用,下面教大家如何配置jdk环境变量: 1.右键选择 计算机→属性→高级系统设置→高级→环境变量 2.系统变量→新 ...

  9. python面对对象编程------4:类基本的特殊方法__str__,__repr__,__hash__,__new__,__bool__,6大比较方法

    一:string相关:__str__(),__repr__(),__format__() str方法更面向人类阅读,print()使用的就是str repr方法更面对python,目标是希望生成一个放 ...

  10. JSON对象与JSON数组的长度和遍历方法

    JSON对象与JSON数组的长度和遍历方法         1.json对象的长度与遍历                 结构:var json={“name”:”sm”,”sex”:”woman”} ...

随机推荐

  1. 【转载】MSVC中C++ UTF8中文编码处理探究

    字符集 先说一个名词:字符集,没听过的先百度一下,其实就是一种将字符编码的格式,像我们常说的ASCII,UTF8,GBK都是常用的字符集. 首先要清楚,从你在编辑器里输入一个UTF8汉字开始,到最终在 ...

  2. 一、Basic CSS 知识整理

    一.编写CSS的几种方式 <style> /* id选择器 */ #id_test { color: red; } /* 标签选择器 */ h2 { color: blue !import ...

  3. python语言linux操作系统oracle环境安装

    金句:如果没把握,最好先Google一下. 1.严格按照 https://oracle.github.io/odpi/doc/installation.html#linux 教程一步步做 包括下载的软 ...

  4. How to enable CIFS in kernel 4.9

    kernel config 要打开这几项

  5. [Mac技巧] 你真的会使用Mac的“聚焦搜索”吗?

    Mac的"聚焦搜索"是对Mac整个磁盘的全局搜索,搜索起来极其便捷,但也常被使用者忽略使用. 以下列出比较常用的几个场景供使用者参考 场景一:文件在哪儿,要立即查看? 1.打开&q ...

  6. 9. PEP8规范

    1. 每一级缩进4个空格 2. 续行时缩进要比正常行多缩进, 要能明显看出是续行的 3. 每一行最多79个字符 4. 函数和类定义时在前后加2个空行, 类内接口在定义时, 前后加1个空行 5. 二元运 ...

  7. luac编译命令

    luac -o out.lua 1.lua 可以不要后缀 luac -o out 1.lua

  8. PicList 现已上架Mac App Store 分享下整个上架过程和遇到的问题

    PicList 是一款云存储/图床平台管理和文件上传工具,基于 PicGo 进行了深度二次开发,保留了 PicGo 的所有功能的同时,为相册添加了同步云端删除功能,同时增加了完整的云存储管理功能,包括 ...

  9. 组合计数中的q-模拟 q analog

    拒绝更新,深度和广度上建议看这个pdf URL里面用到的一些query-string过期了,,, 论文题目是 THE q-SERIES IN COMBINATORICS; PERMUTATION ST ...

  10. 能快速构建和定制网络拓扑图的WPF开源项目-NodeNetwork

    大家好,我是沙漠尽头的狼,今天介绍一个WPF开源项目-NodeNetwork,它可以帮助我们快速构建和定制网络拓扑图. 一.前言 在现代软件开发中,数据可视化和可交互性越来越受到关注.为了实现这一点, ...