JAVA基础|常用API-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)对数组进行排序(默认是升序排序)

三. 使用

1. 返回数组的内容

int[] arr = {10, 20, 30, 40, 50};
System.out.println(Arrays.toString(arr));

2. 拷贝指定范围内的数组内容

int[] arr2 = Arrays.copyOfRange(arr,1,4);
System.out.println(Arrays.toString(arr2));

3. 拷贝数组,可以指定新数组的长度

int[] arr3 = Arrays.copyOf(arr,10);
System.out.println(Arrays.toString(arr3));

4. 把数组中的原数据改为新数据又存进去

例如,我们写个案例,要求将数组内的所有数据打8折之后再存进去:

double[] prices = {99.8,128,100};
//把所有的加个都打八折,然后又存进去
Arrays.setAll(prices, new IntToDoubleFunction() {
      @Override
      public double applyAsDouble(int value) {
            return prices[value] * 0.8;
      }
});
System.out.println(Arrays.toString(prices));

5. 对数组进行排序(默认是升序排序)

Arrays.sort(prices);
System.out.println(Arrays.toString(prices));

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

例如,我们有个学生类,其中包含成员属性:姓名,身高,年龄。我们创建了一个学生对象的数组,那么如何对该数组进行排序呢?

import java.util.Arrays;

public class ArrayTest2 {
    public static void main(String[] args) {
        Student[] students = new Student[4];
        students[0] = new Student("小关",180.0,18);
        students[1] = new Student("小王",179.1,19);
        students[2] = new Student("花魁",127.2,14);
        students[3] = new Student("皇上",124.1,18);

        Arrays.sort(students);
        System.out.println(Arrays.toString(students));
    }
}
public class Student {
    private String name;
    private double height;
    private int 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方法,自己来制定比较规则。

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

    //制定比较规则
    @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;
    }

    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;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", height=" + height + ", age=" + age + "]";
    }
}

在这里,我们进行了以下修改:

  1. 让Student类实现了Comparable接口,要注意这里的Comparable是泛型接口,所以要在后面加上<Student>
  2. 重写Comparable中的compareTo方法
  3. 其实上述步骤已经完成了自定义排序,但由于排序后打印出来的内容是对象的地址,所以我们重写了toString方法

其实,我们在重写compareTo方法的时候没必要写那么多,只需要写一个

return this.age-o.age;

如果左边的对象大于右边的对象,自然就返回正整数,小于,等于的时候同理。

要注意,这么写只是因为age是int类型的变量,所以能得到整数,如果是身高啥的这种double型的就不能这么写了。

那么我们如果想要降序排序的话,直接把掉个头,让o.age-this.age就行了,或者加个符号!

 

方式二:使用下面这个sort方法,创建Comparator比较器接口的匿名内部类对象,然后自己制定比较规则。

public static <T> void sort(T[] arr,Comparator<? super T>c) 对数组进行排序(支持自定义排序规则)

参数一:需要排序的数组,参数二:Comparator比较器对象(用来制定对象的比较规则)

Arrays.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                if (o1.getHeight() > o2.getHeight()) {
                    return 1;
                } else if (o1.getHeight() < o2.getHeight()) {
                    return -1;
                }
                return 0;
            }
        });

这里重写的是compare方法,注意Comparator是一个接口,所以这里要用到他的对象得采用匿名内部类。

这里也可以这么简写:

return Double.compare(o1.getHeight(),o2.getHeight());

用的包装类的比较方法。

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值