Collextions工具类 字典排序的“源码”

在对自定义类的自定义排序的排序方法有两种:
前提是 都养创建LIst 或其子类的 集合 在该集合中存放自定义类的对象(当然,这个对象你已经完成了初始化)

1.按数字的顺序排序

要排序的自定义类要去实现 Comparable的接口 重写comparable接口中的 compareTo() 接口
数字的自定义排序
升序:前 - 后(this.成员变量 - 参数.成员变量)
降序:后 - 前(参数.成员变量 - this.成员变量)

public class Person  implements Comparable <Person>{
    private String name;
    private int age;


    /** 提供满参构造方法*/
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /** 重写toString方法*/
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    /** 重写comparable接口中的 compareTo()方法*/
    @Override
    public int compareTo(Person obj) {
        /**
         * 自定义排序规则
         *  升序  return this.成员变量 - 参数(obj).成员变量
         *  降序  return 参数(obj).成员变量  - this.成员变量
         * */
        return this.age - obj.age;
    }
}

2.按字符串的字典排序

Collections.sort(list, new Comparator<String>() {
Collections.sort(list, new Comparator<String>){
重写接口comparator<E> 的compare 方法
}
package com.itheima.demo2sort;

import java.util.*;

/**
 * @author ChenY@itheima.com
 * @date 2022/7/26 19:27
 */
public class DictionarySort {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        /** 判断最后有没有可以扫描的东西*/
        while (sc.hasNext()){
            /** 确定你要输入的字符串的个数*/
            int n = sc.nextInt();
            /** 利用多态创建对象*/
            List<String> list = new ArrayList<>();
            /** 将字符串存放到集合 list 中去*/
            for (int i = 0; i < n; i++) {
                String str = sc.next();
                list.add(str);
            }
            /** 调用collections工具类的 的sort方法,重写compare方法
             *  根据指定比较器产生的顺序对指定列表进行排序
             *  比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数
             * */
            Collections.sort(list, new Comparator<String>() {
                @Override
                /** 返回值的类型是 int*/
                public int compare(String o1, String o2) {
                    /** 分别将参数o1,o2 toCharArray()是将字符串 转成对应的字符数组*/
                    char[] ch1 = o1.toCharArray();
                    char[] ch2 = o2.toCharArray();
                    /** 字典排序*/
                    int i = 0;
                    /** 在这里开始循环比较 集合中 两个字符串对象的单个字符之间的关系*/
                    while (i<ch1.length&&i<ch2.length){
                        /** o1在o2 之前 ,如果o1的字符在比o2的字符大的话  就返回true*/
                        if (ch1[i]>ch2[i]){
                            return 1;
                        }else if(ch1[i]<ch2[i]){
                            return -1;
                        }else{
                            i++;
                        }
                    }/** 这个循环会一直进行下去 直到循环条件不满足的时候 */

                    /** 字符串的字符数组 o1 到头*/
                    if (i==ch1.length){
                        return -1;
                    }
                    /** 字符串的字符数组 o2 到头*/
                    if (i==ch2.length){
                        return 1;
                    }

                    return 0;
                }
            });
            /** list集合存取顺序一致  将集合中的元素 s 取出*/
            for (String s : list) {
                System.out.println(s);

            }
        }
    }
}


#Java开发#
全部评论
楼主厉害,还上了代码
点赞 回复 分享
发布于 2022-07-27 13:01

相关推荐

永不遗忘:才这么点算什么拉黑,我初筛连着挂几十次了,最后还是能进面
点赞 评论 收藏
分享
谁知道呢_:要掉小珍珠了,库库学三年,这个结果
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务