JavaSE——常用API进阶二(8/8)-Arrays、Comparable、Comparator(Arrays类提供的的常见方法、用法示例)

目录

Arrays

Arrays类提供的的常见方法

用法示例

Comparable、Comparator

Comparable

Comparator


本篇学习Arrays,不算作是重点知识,但是为学习后面的Lambda表达式打一个基础,或者说,作为铺垫。

Arrays

  • 用来操作数组的一个工具类。

Arrays类提供的的常见方法

方法名说明
public static String toString(类型[] arr)返回数组的内容
public static int[] copyOfRange(类型[] arr,起始索引,结束索引)拷贝数组(指定范围)
public static copyOf(类型[] arr, int newLength)拷贝数组
public static setAll(double[] array, IntToDoubleFunction generator)把数组中的原数据改为新数据
public static void sort(类型[] arr) 对数组进行排序(默认是升序排序)

用法示例

public static String toString(类型[] arr)

//1.toString返回数组的内容
int[] arr = new int[]{10,20,30,40,50,60};
System.out.println(Arrays.toString(arr));

public static int[] copyOfRange(类型[] arr,起始索引,结束索引)

int[] arr = new int[]{10,20,30,40,50,60};

//2.拷贝数组 (类型[] arr,起始索引,结束索引)   索引包前不包后
int[] arr2 = Arrays.copyOfRange(arr,1,4);
System.out.println(Arrays.toString(arr2));

public static copyOf(类型[] arr, int newLength)

int[] arr = new int[]{10,20,30,40,50,60};

//3.拷贝数组,可以指定新数组的长度   (类型[] arr,newLength)
int[] arr3 = Arrays.copyOf(arr,10);
System.out.println(Arrays.toString(arr3));

public static setAll(double[] array, IntToDoubleFunction generator)

public class Test {
    public static void main(String[] args){
        //4.把数组中的原数据改为新数据
        double[] prices = {99.8,128,100};
        System.out.println("原价:" + Arrays.toString(prices));
        //把所有的价格都打八折,然后再存进数组
        Arrays.setAll(prices, new IntToDoubleFunction() {
            @Override
            public double applyAsDouble(int value) {
                return prices[value] * 0.8;
                //value = 0  1  2
            }
        });
        System.out.println("打完八折后:" + Arrays.toString(prices));

    }
}

运行结果:

看setAll的源码:

public static void sort(类型[] arr) 

public class Test {
    public static void main(String[] args){
        //4.把数组中的原数据改为新数据
        double[] prices = {99.8,128,100};
        System.out.println("排序前:" + Arrays.toString(prices));

        //5.对数组进行排序(默认是升序排序)
        Arrays.sort(prices);
        System.out.println("排序后:" + Arrays.toString(prices));
    }
}

运行结果:

Comparable、Comparator

如果数组中存储的是对象,那该如何排序呢?

Arrays.sort中没有指定对于对象的排序规则,不知道根据什么来排序,所以如果用它来对对象排序的话是会报错的。

解决方式

  • 方式一让该对象的类实现Comparable(比较规则)接口,然后重写compareTo方法,自己来制定比较规则
  • 方式二使用下面这个sort方法,创建Comparator比较器接口的匿名内部类对象,然后自己制定比较规则
public static<T>void sort(T[]arr,Comparator<?super T>c)
//对数组进行排序(支持自定义排序规则)

 我们来看方式一:实现Comparable接口

Comparable

public class Test {
    public static void main(String[] args){
        Student[] students = new Student[4];
        students[0] = new Student("蜘蛛精",169.5,24);
        students[1] = new Student("紫霞",163.8,25);
        students[2] = new Student("紫霞",163.8,25);
        students[3] = new Student("至尊宝",167.5,21);

        //1.对数组进行排序
        Arrays.sort(students);
        System.out.println(Arrays.toString(students));
    }
}
package user.APITest;

public class Student implements  Comparable<Student>{
    private String name;
    private double height;
    private int age;

    //制定比较规则
    //假设this 与 o 进行比较
    @Override
    public int compareTo(Student o) {
        //约定1:认为左边对象 大于 右边对象,则要返回正整数
        //约定2:认为左边对象 小于 右边对象,则要返回负整数
        //约定3:认为左边对象 等于 右边对象,则要返回0
        //按照年龄升序排序
        if(this.age > o.age){
            return 1;
        }else if(this.age < o.age){
            return -1;
        }
        return 0;
    }

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

    public Student() {
    }

    public Student(String name, double height, int age) {
        this.name = name;
        this.height = height;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

通过让对象的类实现Comparable接口并且重写compareTo方法,可以自定义排序规则,对对象数组进行排序,运行结果:

注意:这里制定排序规则,我们可以换一下编码思路,改得更简洁一点 

例如:

    //制定比较规则
    //假设this 与 o 进行比较
    @Override
    public int compareTo(Student o) {
        //约定1:认为左边对象 大于 右边对象,则要返回正整数
        //约定2:认为左边对象 小于 右边对象,则要返回负整数
        //约定3:认为左边对象 等于 右边对象,则要返回0
        //按照年龄升序排序
//        if(this.age > o.age){
//            return 1;
//        }else if(this.age < o.age){
//            return -1;
//        }
//        return 0;
        return this.age - o.age;
    }

 如果要将升序排序改为降序,那调换一下位置即可:

return o.age - this.age;

 也就是原本this > o,按升序进行相减时返回正整数;那么换位置进行相减得到负整数,从原本认为this > o的改为了o > this。也就是说,返回负整数,证明左边对象this 小于 右边对象o。

接下来再看方式二:Comparator

Comparator

现在来排序Student类里面的身高,方式二实际上是调用sort的重载方法,其参数需要传入该对象以及Comparator比较器接口的匿名内部类对象。

public class Test {
    public static void main(String[] args){
        Student[] students = new Student[4];
        students[0] = new Student("蜘蛛精",169.5,24);
        students[1] = new Student("紫霞",163.8,25);
        students[2] = new Student("紫霞",163.8,25);
        students[3] = new Student("至尊宝",167.5,21);

        //2.方式二:创建Comparator比较器接口的匿名内部类对象,然后自己制定比较规则。
        Arrays.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                //制定比较规则
                //o1    o2
                //这里的规则是与前面一模一样的
                //约定1:认为左边对象 大于 右边对象,则要返回正整数
                //约定2:认为左边对象 小于 右边对象,则要返回负整数
                //约定3:认为左边对象 等于 右边对象,则要返回0
                //根据身高排序
                //return o1.getHeight() - o2.getHeight(); //这里就不能使用之前那种编码方式了,不能保证相减得到的正整数是准确的结果

                //先来看第一种:  升序
                if(o1.getHeight() > o2.getHeight()){
                    return 1;
                }else if(o1.getHeight() < o2.getHeight()){
                    return -1;
                }
                return 0;
            }
        });
        System.out.println(Arrays.toString(students));
    }
}

运行结果:

将排序规则的编码简化:

下篇就要学习Lambda表达式,对匿名内部类进行简化。


END


学习自:黑马程序员——JavaSE课程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/568975.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初见-响应式编程-002

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace #Reacti…

lnmp架构

目录 环境 步骤 下载nginx源码包&#xff0c;并解压 安装依赖包 进行预编译 、编译安装 安装php、设置开机自启 配置nginx让其支持php服务 浏览器测试 安装mariadb 部署discuz论坛 简介 LNMP架构是一种常见的Web服务器架构&#xff0c;由Linux、Nginx、MySQL和PHP组成。它…

高级数据结构—线段树(一)

学线段树的原因是因为cf的一道题目始终想不出来怎么优化&#xff0c;后来知道区间查询和修改要用到线段树。。。 原题&#xff1a;Iva & Pav 线段树的作用 区间最值查询&#xff1a;可以高效地找到给定区间内的最大值、最小值等。 区间和查询&#xff1a;可以高效地计算…

Leetcode算法训练日记 | day34

专题九 贪心算法 一、K次取反后最大化的数组和 1.题目 Leetcode&#xff1a;第 1005 题 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个…

关于Spring事务管理之默认事务间调用问题

由事务的传播行为我们知道, 如果将方法配置为默认事务REQUIRED在执行过程中Spring会为其新启事务REQUIRES_NEW, 作为一个独立事务来执行. 由此存在一个问题。 如果使用不慎, 会引发org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back bec…

ACE框架学习

目录 ACE库编译 ACE Reactor框架 ACE_Time_Value类 ACE_Event_Handler类 ACE定时器队列类 ACE_Reator类 ACE Reactor实现 ACE_Select_Reactor类 ACE_TP_Reactor类 ACE_WFMO_Reactor类 ACE库编译 首先去ACE官网下载安装包&#xff0c;通过vs2017或者2019进行编译&#x…

【洛谷 P8605】[蓝桥杯 2013 国 AC] 网络寻路 题解(图论+无向图+组合数学)

[蓝桥杯 2013 国 AC] 网络寻路 题目描述 X X X 国的一个网络使用若干条线路连接若干个节点。节点间的通信是双向的。某重要数据包&#xff0c;为了安全起见&#xff0c;必须恰好被转发两次到达目的地。该包可能在任意一个节点产生&#xff0c;我们需要知道该网络中一共有多少种…

10.接口自动化测试学习-Pytest框架(2)

1.mark标签 如果在每一个模块&#xff0c;每一个类&#xff0c;每一个方法和用例之前都加上mark标签&#xff0c;那么在pytest运行时就可以只运行带有该mark标签的模块、类、接口。 这样可以方便我们执行自动化时&#xff0c;自主选择执行全部用例、某个模块用例、某个流程用…

数据分析专家能力模型

招式&#xff1a;懂商业&#xff08;业务能力&#xff09; 外功更偏重于技能&#xff0c;首先需要懂招式&#xff0c;即懂商业&#xff0c;数据分析最终是为业务服务的&#xff0c;无论是互联网企业准求的用户增长和UJM分解&#xff0c;还是传统企业追求的降本增效和精细化运营…

appium相关的知识

>adb shell dumpsys window | findstr mCurrentFocus adb devices # 实例化字典 desired_caps = dict() desired_caps[platformName] = Android desired_caps[platformVersion] = 9 # devices desired_caps[deviceName] = emulator-5554 # 包名 desired_caps[appPackage] …

重建大师出现“密集匹配失败”的情况是什么原因?

答&#xff1a;一般出现密集匹配失败的情况&#xff0c;就是瓦块连接点过少&#xff0c;空瓦块边缘瓦块等原因导致。遇见这种情况&#xff0c;确定是边缘瓦块导致后&#xff0c;就可以不用管&#xff0c;不是模型主体&#xff0c;不影响成果。 重建大师是一款专为超大规模实景三…

MySQL__索引

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a; MySQL__索引&#xff09; ⏱️ 创作时间&#xff1a;2024年04月23日 ———————————————— 索引介绍…

消消乐算法总结

前言 最近在工作中遇到一个问题&#xff0c;做一个消消乐的demo项目&#xff0c;连续相同数目超过四个后就要消除。我在网上看了很多解决方案&#xff0c;有十字形&#xff0c;横向&#xff0c;纵向&#xff0c;梯形搜索。越看越迷糊。这不是用一个BFS就能解决的问题吗&#x…

MySQL数据库进阶篇一(存储引擎、索引)

目录 一、存储引擎1.1、MySQL体系结构&#xff1a;连接层&#xff0c;Server层&#xff0c;引擎层&#xff0c;存储层1.2、存储引擎1.2.1、存储引擎&#xff1a;InnoDB(MySQL 5.5后默认的存储引擎)1.2.2、存储引擎&#xff1a;MyISAM (MySQL早期默认存储引擎)1.2.3、存储引擎&a…

数据可视化———Tableau

基本认识&#xff1a; 维度&#xff1a;定性—字符串文本&#xff0c;日期和日期时间等等 度量&#xff1a;定量—连续值&#xff0c;一般属于数值 数据类型&#xff1a; 数值 日期/日期时间 字符串 布尔值 地理值 运算符 算数运算符&#xff1a;加减乘除,%取余&#xff0c;…

【Flask】Flask中HTTP请求与接收

一、接收http请求与返回响应 在Flask中&#xff0c;可以通过app.route装饰器来定义路由函数。 app.route(/BringGoods,methods [POST, GET]) GET请求&#xff1a;使用request.args.get(key)或者request.values.get(key)来获取URL中的参数。 POST请求&#xff1a; 使用req…

Python自学之路--001:Python + PyCharm安装图文详解教程

目录 1、概述 2、Python解释器 2.1、下载 2.2、Python安装 2.3、Python环境变量配置&#xff0c;必选项 3、PyCharm安装 3.1、PyCharm下载 3.2、PyCharm安装 4、建一个Hello World 5、Phcarm设置 5.1、Phcarm汉化 5.2、Phcarm工具栏显示在顶部 5.3、Phcarm通过pip安…

【QT学习】9.绘图,三种贴图,贴图的转换,不规则贴图(透明泡泡)

一。绘图的解释 Qt 中提供了强大的 2D 绘图系统&#xff0c;可以使用相同的 API 在屏幕和绘图设备上进行绘制&#xff0c;它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。 QPainter 用于执行绘图操作&#xff0c;其提供的 API 在 GUI 或 QImage、QOpenGLPaintDev…

linux18:进程等待

进程等待的必要性 1&#xff1a;子进程创建的目的是要完成父进程指派的某个任务&#xff0c;当子进程运行完毕退出时&#xff0c;父进程需要通过进程等待的方式&#xff0c;回收子进程资源&#xff0c;获取子进程退出信息&#xff08;子进程有无异常&#xff1f;没有异常结果是…

研究发现:提示中加入数百个示例显著提升大型语言模型的性能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…