78-Java的可变参数、集合操作的工具类-Collections

补充知识


一、可变参数

1、案例导学
(1)需求:
  • 假如需要定义一个方法求和,该方法可以灵活的完成如下需求:
    • 计算1个数据的和;
    • 计算2个数据的和;
    • 计算3个数据的和;
    • 计算n个数据的和,甚至可以支持不接收参数进行调用。

(2)解决需求
  • 可变参数

    • 可变参数用在形参中可以接收多个数据。

    • 可变参数的格式:

      数据类型...参数名称
      
      public static void sum(int...nums){
          
      }
      
  • 可变参数的作用

    • 传输参数非常灵活,方便。
    • 可以不传输参数,可以传输1个或者多个参数,也可以传输一个数组。

在这里插入图片描述

package com.app.d4_params;

import java.util.Arrays;

/**
    目标:理解可变参数的作用,并学会使用可变参数解决实际需求。
    需求:
     假如需要定义一个方法求和,该方法可以灵活的完成如下需求:
        计算1个数据的和;
        计算2个数据的和;
        计算3个数据的和;
        计算n个数据的和,甚至可以支持不接收参数进行调用。
 */
public class ParamsDemo1 {
    public static void main(String[] args) {
        sum();                          // 1、可以不传输参数
        sum(10);                 // 2、可以传输一个参数
        sum(15, 5, 20);          // 3、可以传输多个参数
        sum(new int[]{10, 5, 15, 30});  // 4、可以传输一个数组
    }

    public static void sum(int...nums){
        // 注意:可变参数在方法内部其实就是一个数组。nums
        System.out.println("元素个数:" + nums.length);
        System.out.println("元素内容:" + Arrays.toString(nums));
    }
}
元素个数:0
元素内容:[]
元素个数:1
元素内容:[10]
元素个数:3
元素内容:[15, 5, 20]
元素个数:4
元素内容:[10, 5, 15, 30]

Process finished with exit code 0

(3)可变参数的注意事项:
  • 一个形参列表中可变参数只能有一个;
    在这里插入图片描述

  • 可变参数必须放在形参列表的最后面。

    在这里插入图片描述




二、集合工具类:Collecitons

1、概述及作用
  • java.utils.Collections:是集合工具类
  • 作用:Collections并不属于集合,是用来操作集合的工具类。

2、Collections常用的API
方法说明
public static < T > boolean addAll(Collection< ? super T> c, T… elements)给集合对象批量添加元素
public static void shuffle(List<?> list)打乱List集合元素的顺序(通俗点讲:洗牌)

3、Collections排序相关的API
  • 使用范围:只能对于List集合的排序。

  • 排序方式一:

    方法说明
    public static < T > void sort(List< T > list)将集合中元素按照默认规则排序
  • 排序方式二:

    方法说明
    public static < T > void sort(List< T > list, Comparator<? super T> c)将集合中元素按照指定规则排序

package com.app.d5_Collections;

/**
    自定义类:猫类。
    让自定义的类实现Comparable接口重写里面的compareTo方法,来自定义比较规则。
 */
public class Cat implements Comparable<Cat>{
    /**
     * 重写Comparable接口的compareTo方法,来自定义比较规则。
     * @param o 接收一个猫对象
     * @return
     */
    @Override
    public int compareTo(Cat o) {
        /*
          关于返回值的规则:
            - 如果认为第一个元素大于第二个元素,返回正整数即可。
            - 如果认为第一个元素小于第二个元素,返回负整数即可。
            - 如果认为第一个元素等于第二个元素,返回0即可。
         */
        // 自定义比较规则:按照猫的重量来排序
        // 升序
        return this.weight - o.weight;  // List集合存储相同大小的元素,会保留!因为List集合是可重复的
    }

    /**
        猫的属性:昵称、毛色、价格、重量
     */
    private String name;
    private String color;
    private double price;
    private int weight;

    public Cat(){

    }

    public Cat(String name, String color, double price, int weight) {
        this.name = name;
        this.color = color;
        this.price = price;
        this.weight = weight;
    }

    public String getName() {
        return name;
    }

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

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", color='" + color + '\'' +
                ", price=" + price +
                ", weight=" + weight +
                '}';
    }


}
package com.app.d5_Collections;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
    目标:掌握Collections工具类的常用API
 */
public class CollectionsDemo1 {
    public static void main(String[] args) {
        // 1、给任意集合批量添加元素
        List<String> names = new ArrayList<>();
        // 之前的添加元素,只能一个一个的加
        // names.add("楚留香");
        // names.add("胡铁花");
        // names.add("张无忌");
        // names.add("陆小凤");

        Collections.addAll(names, "楚留香", "胡铁花", "张无忌", "陆小凤");
        System.out.println(names);

        System.out.println("----------------------------------");

        // 2、打乱List集合顺序(每次执行都会打乱)。
        // 注意不是打乱Set集合的顺序,因为Set集合本身就是无序的
        Collections.shuffle(names);
        System.out.println(names);

        System.out.println("----------------------------------");

        // 3、将List集合中的元素按照默认规则排序。
        List<Integer> numbers = new ArrayList<>();
        Collections.addAll(numbers, 33, 12, 3, 2);
        System.out.println("排序前:" + numbers);
        Collections.sort(numbers);
        System.out.println("排序后:" + numbers);

        System.out.println("----------------------------------");

        // 4、将List集合中的元素按照指定规则排序
        List<Cat> cats = new ArrayList<>();
        Collections.addAll(cats,
                new Cat("胖球", "花白色", 899.9, 40),
                new Cat("咪咪", "白色", 666.5, 40),
                new Cat("小黑", "黑色", 899.8, 25),
                new Cat("虾皮", "黄色", 566.9, 33)
        );

        System.out.println("排序前:");
        for (Cat cat : cats) {
            System.out.println(cat);
        }
        System.out.println();

        // Collections.sort(cats);     // 可以的,因为Cat类已经重写了比较规则
        // 指定规则排序方式二:直接在Collections的sort方法设置Comparable接口对应的比较器对象(推荐)
        /*Collections.sort(cats, new Comparator<Cat>() {
            @Override
            public int compare(Cat o1, Cat o2) {
                // 自定义比较规则:按照猫的重量降序排序
                return o2.getWeight() - o1.getWeight(); // List集合存储相同大小的元素,会保留!因为List集合是可重复的
            }
        });*/
        
        // 简化:Lambda表达式——>按照猫的重量降序排序
        Collections.sort( cats, (o1, o2) -> Double.compare(o2.getPrice(), o1.getPrice()) );

        System.out.println("排序后:");
        for (Cat cat : cats) {
            System.out.println(cat);
        }
    }
}
[楚留香, 胡铁花, 张无忌, 陆小凤]
----------------------------------
[楚留香, 陆小凤, 张无忌, 胡铁花]
----------------------------------
排序前:[33, 12, 3, 2]
排序后:[2, 3, 12, 33]
----------------------------------
排序前:
Cat{name='胖球', color='花白色', price=899.9, weight=40}
Cat{name='咪咪', color='白色', price=666.5, weight=40}
Cat{name='小黑', color='黑色', price=899.8, weight=25}
Cat{name='虾皮', color='黄色', price=566.9, weight=33}

排序后:
Cat{name='胖球', color='花白色', price=899.9, weight=40}
Cat{name='小黑', color='黑色', price=899.8, weight=25}
Cat{name='咪咪', color='白色', price=666.5, weight=40}
Cat{name='虾皮', color='黄色', price=566.9, weight=33}

Process finished with exit code 0



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值