Java 数组排序 sort,Comparator实现排序/学生身高体重排序 /

一、使用comparator排序步骤

  1. 创建Comparator对象
  2. 实现compare方法
  3. 使用Comparator进行排序

二、第一步:创建comparator对象

comparator是一个接口,必须交给类来实现。

接口无法被实例化,但是可以被实现。

实际用法

Comparator<T> comparator = new Comparator<T>() {

   @Override

   public int compare(T o1, T o2) {

    // 在这里定义对象比较的规则

    }

};

当你使用new Comparator<Integer>() { ... }创建一个匿名内部类时,实际上是在创建一个实现了Comparator接口的匿名类的实例。这种方式可以方便地定义并实例化一个实现了Comparator接口的对象,并且可以在其中实现compare方法来自定义排序逻辑。

这种方式通常用于在使用一次性的比较逻辑时,不需要为比较逻辑创建一个独立的类。匿名内部类可以直接在需要的地方实例化,比较灵活和简洁。这样的实现通常用在只需要一次性使用的简单逻辑的情况下。

Java 匿名类 | 菜鸟教程

 三、第二步:实现comparator方法

Comparator<T> comparator = new Comparator<T>() {
    @Override
    public int compare(T o1, T o2) {
        // 比较o1和o2的大小
        if (o1 < o2) {
            return -1; // 返回负整数,表示o1小于o2
        } else if (o1 > o2) {
            return 1; // 返回正整数,表示o1大于o2
        } else {
            return 0; // 返回零,表示o1等于o2
        }
    }
};

compare方法比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。

 实际使用:身高体重排序

有一群人需要列队,首先按照身高排序;若身高相同,体重轻的在前面;若身高体重均相同,则维持原有的位置。

            public int compare(Integer i1, Integer i2) {

                if (heights[i1] != heights[i2]) {

                    return heights[i1] - heights[i2]; // 按照身高升序排列

【如果i1的身高小于i2的身高,这个值为负数,则i1小于i2,以此类推完成i1和i2的比较】

                } else if (weights[i1] != weights[i2]) {

                    return weights[i1] - weights[i2]; // 若身高相同,按照体重升序排列

【如果i1的体重小于i2的体重,这个值为负数,则第一个i1小于i2;】

                } else {

                    return ids[i1] - ids[i2]; // 若身高和体重都相同,维持原有的编号顺序

【如果都相同,就不管谁id大,谁就大】

                }

            }

四、第三步、使用comparator排序 

 实际使用代码

在完成Comparator对象的创建和compare方法的实现后,就可以使用Comparator进行排序了。下面是使用Comparator进行排序的代码示例:

List<T> list = new ArrayList<>(); // 添加要排序的对象到list中

Collections.sort(list, comparator);

 在上述代码中,我们使用Collections.sort方法对list进行排序,第一个参数是要排序的list,第二个参数是Comparator对象。

实例:身高体重排序

 

 Integer[] indices = new Integer[n];

        for (int i = 0; i < n; i++) {

            indices[i] = i;

        }

//匿名内部类的实例对象      

Arrays.sort(indices, new Comparator<Integer>() {

            public int compare(Integer i1, Integer i2) {

                if (heights[i1] != heights[i2]) {

                    return heights[i1] - heights[i2]; // 按照身高升序排列

                } else if (weights[i1] != weights[i2]) {

                    return weights[i1] - weights[i2]; // 若身高相同,按照体重升序排列

                } else {

                    return ids[i1] - ids[i2]; // 若身高和体重都相同,维持原有的编号顺序

                }

            }

        });

相关知识:在哪里使用sort

在 Java 中,sort 方法可以用于以下几种集合类:

  1. List 接口的实现类:比如 ArrayList、LinkedList
  2. 数组:可以使用 java.util.Arrays 类中的静态 sort 方法对数组进行排序
  3. 队列:比如 PriorityQueue
  4. 其他实现了 Collection 接口的类,但要求元素具有比较性,例如 TreeSet

需要注意的是,对于自定义的对象进行排序,对象需要实现 Comparable 接口或者提供 Comparator 接口的实现。否则,对于一些没有自然顺序的对象,sort 方法可能会抛出 ClassCastException 异常。

Arrays.Sort()

参考:​​​​​​java comparator的用法_mob64ca12d52440的技术博客_51CTO博客java comparator的用法,#JavaComparator的用法##1.引言在Java中,Comparator接口是用来定义两个对象的比较规则的,它可以实现对对象的排序和定制化排序。对于刚入行的小白来说,了解如何使用Comparator是非常重要的。本文将为你详细介绍JavaComparator的用法,帮助你快速掌握它的使用方法。##2.流程图```flowst=>start:开始op1=>oicon-default.png?t=N7T8https://blog.51cto.com/u_16213319/7011069

五、其他:字串排序

import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        // 待排序的字符串数组
        String[] strings = {"apple", "zebra", "banana", "orange"};

        // 使用自定义规则进行排序


        Arrays.sort(strings, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                // 定义每个字母的数值映射
                Map<Character, Integer> charValues = new HashMap<>();
                charValues.put('a', 1);
                charValues.put('b', 2);
                charValues.put('c', 3);
                charValues.put('d', 4);
                charValues.put('e', 5);
                // ... 其他字母的数值映射

                // 计算字符串的总值
                int value1 = 0;
                for (char c : s1.toCharArray()) {
                    value1 += charValues.getOrDefault(c, 0);
                }

                int value2 = 0;
                for (char c : s2.toCharArray()) {
                    value2 += charValues.getOrDefault(c, 0);
                }

                // 如果数值相同,则按照字母的自然顺序来排序
                if (value1 == value2) {
                    return s1.compareTo(s2);
                }
                // 否则按照数值排序
                return Integer.compare(value1, value2);

            }
        });

        // 打印排序后的字符串数组
        for (String str : strings) {
            System.out.print(str + " ");
        }
    }
}

Java compareTo() 方法 | 菜鸟教程Java compareTo() 方法 Java String类 compareTo() 方法用于两种方式的比较: 字符串与对象进行比较。 按字典顺序比较两个字符串。 语法 [mycode3 type='java'] int compareTo(Object o) 或 int compareTo(String anotherString) [/mycode3] 参数 o -- 要比较的..icon-default.png?t=N7T8https://www.runoob.com/java/java-string-compareto.html 

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值