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

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

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

Arrays

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

Arrays类提供的的常见方法

图片.png

用法示例

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比较器接口的匿名内部类对象,然后自己制定比较规则。
1. 
public static<T>void sort(T[]arr,Comparator<?super T>c)
2. //对数组进行排序(支持自定义排序规则)

我们来看方式一:实现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



目录
相关文章
|
3月前
|
监控 供应链 API
速卖通商品 API,开发者示例
速卖通商品API是速卖通开放平台为开发者提供的接口,支持获取商品详情、订单管理等功能。具备多语言、多货币支持,适用于全球电商场景。可应用于商品分析、价格监控、竞品对比和库存管理等业务。文档提供Python调用示例,便于快速集成使用。
|
3月前
|
JSON API 数据格式
洋码头商品 API 示例指南(Python 实现)
洋码头是国内知名跨境电商平台,提供商品搜索、详情、分类等API接口。本文详解了使用Python调用这些API的流程与代码示例,涵盖签名生成、请求处理及常见问题解决方案,适用于构建选品工具、价格监控等跨境电商应用。
|
3月前
|
缓存 JSON API
VIN车辆识别码查询车五项 API 实践指南:让每一俩车有迹可循(Python代码示例)
VIN(车辆识别代码)是全球唯一的17位汽车标识码,可快速获取车架号、发动机号、品牌型号等核心信息。在二手车交易、保险理赔、维修保养等场景中,准确解析VIN有助于提升效率与风控能力。本文介绍VIN码结构、适用场景,并提供Python调用示例及优化建议,助力企业实现车辆信息自动化核验。
533 1
|
29天前
|
人工智能 API 开发者
图文教程:阿里云百炼API-KEY获取方法,亲测全流程
本文详细介绍了如何获取阿里云百炼API-KEY,包含完整流程与截图指引。需先开通百炼平台及大模型服务,再通过控制台创建并复制API-KEY。目前平台提供千万tokens免费额度,适合开发者快速上手使用。
527 5
|
3月前
|
测试技术 API 开发者
淘宝关键词搜索商品列表API接入指南(含Python示例)
淘宝关键词搜索商品列表API是淘宝开放平台的核心接口,支持通过关键词检索商品,适用于比价、选品、市场分析等场景。接口提供丰富的筛选与排序功能,返回结构化数据,含商品ID、标题、价格、销量等信息。开发者可使用Python调用,需注意频率限制与错误处理,建议先在沙箱环境测试。
|
3月前
|
JSON API 开发者
唯品会商品API,开发者示例
唯品会商品API支持获取商品详情、价格及库存信息,适用于开发者集成商品数据。通过如`vip.item_get`等接口,可使用Python等语言调用,实现商品信息查询与列表筛选。实际使用需申请官方授权或通过第三方平台接入,并遵守相关调用规则。
|
3月前
|
缓存 JSON API
淘宝关键词搜索 API 接口详解与示例
淘宝关键词搜索API(taobao.items.search)助力开发者高效获取商品数据,支持分页、筛选与排序。本文详解接口调用流程、签名机制及Python实现,涵盖权限申请、代码示例与常见问题解决方案,助你快速构建电商应用。
|
4月前
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
|
3月前
|
JSON API 开发者
一号店商品 API 示例指南(Python 实现)
本教程介绍如何使用 Python 调用一号店商品 API,涵盖商品搜索、详情、分类等接口的调用方法。内容包括注册认证、签名生成、代码实现及常见问题解决方案,并提供完整示例代码,帮助开发者快速接入一号店开放平台,构建电商工具与数据分析应用。
|
3月前
|
JSON API PHP
10多万语录随机一言API接口详解及调用示例
随机一言API可输出心灵鸡汤、至理名言等内容,适用于评论系统、签名生成等场景。完全免费,支持GET/POST请求。需注册获取专属ID和KEY,返回JSON格式数据,并提供PHP、Python调用示例。注意密钥安全与频率限制,内容版权归接口盒子所有。应用于每日推送、心情日记等多种场景。

热门文章

最新文章