集合中常用方法的使用

2023-10-27

集合中常用方法的使用

数组和List之间的转化

数组转化为List

        // 1.数组转化为List
        Integer a[] = {1, 3, 4, 5, 2};
        List<Integer> lista = new ArrayList<>();
        // 1.1 通过addAll()方法来转换
        Collections.addAll(lista, a);
        lista.forEach(System.out::println);
        // 1.2 通过asList()方法来转换,这里所获取到的List只能读取(类似于视图),不能进行增删改的操作
        List<Integer> lista2 = Arrays.asList(a);
        lista2.forEach(System.out::println);
        // 通过再次转化后的List可以进行增删改操作
        List<Integer> lista2l = new ArrayList<>(Arrays.asList(a));
        lista2l.forEach(System.out::println);
        // 1.3 采用API9的静态方法
        List<Integer> lista3 = List.of(a);
        lista3.forEach(System.out::println);
        // 1.4 函数式Stream写法
        int[] cardNumberArray = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        List<Integer> collect1 = Arrays.stream(cardNumberArray).boxed().collect(Collectors.toList());
        collect1.forEach(System.out::println);

List转化为数组

 		// 2.List转化为数组
        List<Integer> listb = Arrays.asList(1, 3, 2, 5, 4);
        // 2.1 采用toArray()方法来转换
        // 转化为任意类型的数组
        Object[] objects = listb.toArray();
        System.out.println(Arrays.toString(objects));
        // 转化为固定数据类型的数组
        Integer[] b = listb.toArray(new Integer[listb.size()]);
        System.out.println(Arrays.toString(b));
        // 采用函数式接口的写法(简洁写法)
        Integer[] b2 = listb.toArray(Integer[]::new);
        System.out.println(Arrays.toString(b2));

        // 2.2 采用stream的流式写法
        // 把int的List转化成int的数组
        List<Integer> listc = Arrays.asList(1, 4, 2, 3, 5, 6);
        int[] arrc = listc.stream().mapToInt(Integer::intValue).toArray();
        System.out.println(Arrays.toString(arrc));

        // 把String的List转换成int的数组
        List<String> listd = Arrays.asList("1", "4", "2", "3", "5");
        int[] arr = listd.stream().flatMapToInt(num -> IntStream.of(Integer.parseInt(num))).toArray();
        listd.stream().flatMapToInt(num -> IntStream.of(Integer.parseInt(num))).forEach(System.out::println);
        System.out.println(Arrays.toString(arr));

        // 2.3 使用collections工具类的copy()方法
        List<Integer> list = Arrays.asList(new Integer[listb.size()]);
        Collections.copy(list, listb);
        list.forEach(System.out::println);

包装类型的数据转化

list->array(注:只能转化到包装类)

        List<Integer> list = Arrays.asList(1, 3, 4, 5, 2);
        Integer[] array = list.toArray(Integer[]::new);
        System.out.println(Arrays.toString(array));

array->list(注:只能用包装类转化)

 		Integer[] array = {1, 3, 5, 4, 2};
        List<Integer> list = Arrays.asList(array);
        list.forEach(System.out::println);
        System.out.println(list);

数组基本类型和包装类之间转化

包装类转为基本类型

        Integer[] basicArr = {1, 3, 5, 4, 2};
        int[] ints = Arrays.stream(basicArr).mapToInt(Integer::intValue).toArray();
        System.out.println(Arrays.toString(ints));

基本类型转为包装类

        int [] array = {1, 3, 5, 4, 2};
        Integer [] ints = Arrays.stream(array).boxed().toArray(Integer[]::new);
        System.out.println(Arrays.toString(ints));

数组和List的排序

数组排序

  1. 升序
        Integer a[] = {1, 4, 3, 2, 6, 5};
        Arrays.sort(a);
        System.out.println(Arrays.toString(a));

结果:

[1, 2, 3, 4, 5, 6] 
  1. 降序
 		Integer a[] = {1, 4, 3, 2, 6, 5};
        Arrays.sort(a, Comparator.reverseOrder());
        System.out.println(Arrays.toString(a));

结果:

[6, 5, 4, 3, 2, 1]

List排序

升序和降序

        List<Integer> list = Arrays.asList(1, 4, 3, 2, 6, 5);
        Collections.sort(list, Comparator.reverseOrder());
        System.out.println(list);

结果:

[6, 5, 4, 3, 2, 1]

Comparator和Comparable接口

  • Comparable: 自己和自己比较,属于自营性质的比较器。以-able结尾,表示自身具备某种能力,比较方法为compareTo
  • Comparator: 第三方比较器。以-or结尾,表示自身是比较器的实践者,比较方法为compare

如果这个排序规则不符合业务方需求,那么直接修改compareTo方法不是一定可行的。有以下原因:

  1. 根据开闭原则,最好不要对自己已经交付的类进行修改。
  2. 这个排序规则有可能被有其他业务方在使用。
  3. 这个Person类是他人提供的类,我们没有源码。

这时候就需要用到Comparator比较器了,Comparator比较器可以让业务方根据自身需求修改排序规则。

Comparable

Comparable属于内部比较器,需要重写compareTo()方法

案例1:请声明一个员工类Employee,有编号,姓名,薪资,实现java.lang.Comparable接口,按照编号升序排序。
在测试类TestEmployee中,创建员工数组,并初始化5个员工,
(1)调用Arrays.sort(Object[] arr)排序,按照编号升序排列
(2)调用Arrays.sort(Object[] arr,Comparator c)排序,按照薪资降序排列

public class Employee implements Comparable<Employee> {
    private int id;

    private String name;

    private int salary;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public Employee(int id, String name, int salary) {
        this.id = id;
        this.name = name;
        this.salary = salary;
    }

    @Override
    public int compareTo(Employee employee) {
        return id - employee.getId();
    }

    @Override
    public String toString() {
        return "Employee{" + "id=" + id + ", name='" + name + '\'' + ", salary=" + salary + '}';
    }
}
public class EmployeeTest {
    public static void main(String[] args) {
        Employee employee = new Employee(1, "zs", 2);
        Employee employee2 = new Employee(2, "ls", 3);
        Employee employee3 = new Employee(3, "ww", 4);
        Employee employee4 = new Employee(4, "zl", 5);
        List<Employee> list = new ArrayList<>();
        list.add(employee);
        list.add(employee2);
        list.add(employee3);
        list.add(employee4);
        Collections.sort(list);
        list.forEach(System.out::println);
    }
}

结果:

Employee{id=1, name='zs', salary=2}
Employee{id=2, name='ls', salary=3}
Employee{id=3, name='ww', salary=4}
Employee{id=4, name='zl', salary=5}

Comparator

Comparator属于外部比较器,需要重写compare()方法

    public static void main(String[] args) {
        Employee employee = new Employee(1, "zs", 2000);
        Employee employee2 = new Employee(2, "ls", 5000);
        Employee employee3 = new Employee(3, "ww", 3000);
        Employee employee4 = new Employee(4, "zl", 4000);
        List<Employee> list = new ArrayList<>();
        list.add(employee);
        list.add(employee2);
        list.add(employee3);
        list.add(employee4);
        Collections.sort(list, (v1, v2) -> v2.getSalary()-v1.getSalary());
        list.forEach(System.out::println);
    }

结果:

Employee{id=2, name='ls', salary=5000}
Employee{id=4, name='zl', salary=4000}
Employee{id=3, name='ww', salary=3000}
Employee{id=1, name='zs', salary=2000}

HashMap的排序

https://www.cnblogs.com/yzhmj/p/14919027.html

案例:根据value进行降序排列,在value相同时,根据key进行升序排列

    public static void main(String[] args) {
        HashMap<Integer, Integer> map = new HashMap<>();
        map.put(0, 28);
        map.put(2, 28);
        map.put(5, 50);
        ArrayList<Map.Entry<Integer, Integer>> entries = new ArrayList<>(map.entrySet());
        Collections.sort(entries, (e1, e2) -> {
            int re = e2.getValue() - e1.getValue();
            if (re == 0) {
                return e1.getKey() - e2.getKey();
            } else {
                return re;
            }
        });
        entries.forEach(k -> System.out.println(k));
        List<Integer> klist = entries.stream().map(Map.Entry::getKey).collect(Collectors.toList());
        System.out.println(klist);
    }

结果:

5=50
0=28
2=28
[5, 0, 2]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

集合中常用方法的使用 的相关文章

  • jvm中本机代码如何转换为机器代码[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我读过一些文章说 jvm将字节码转换为机器码 jvm将字节码转换为本机代码 jvm 将字节码转换为系统调用 系统调用又由操作系统与硬件
  • 使用正则表达式验证输入字符串是否为 0-255 之间的数字

    我在将输入字符串与正则表达式匹配时遇到问题 我想验证输入数字在 0 255 之间并且长度最多应为 3 个字符 代码工作正常 但当我输入 000000 至任意长度时 显示 true 而不是 false 这是我的代码 String IP 000
  • ResultSet:通过索引检索列值与通过标签检索

    使用 JDBC 时 我经常遇到这样的结构 ResultSet rs ps executeQuery while rs next int id rs getInt 1 Some other actions 我问自己 以及代码作者 为什么不使用
  • Active MQ - HelloWorld 示例异常

    我正在尝试运行 hello world 示例在这里找到 http activemq apache org hello world html I added activemq all 5 5 1 jar已经到图书馆了 它构建成功 但出现以下警
  • EL 通过 Scriptlet

    在 JSP 中使用 EL 相对于 scriptlet 的优势是什么 EL 被认为是无脚本语言 EL 使 JSP 免受容易出错原始 Java 代码并强制您根据 MVC 思想编写 JSP EL 或像 JSTL 这样的标签库 不可能实现的任何事情
  • 全静态方法和应用单例模式有什么区别?

    我正在创建一个数据库来存储有关我的网站用户的信息 我正在使用 stuts2 因此使用 Java EE 技术 对于数据库 我将创建一个 DBManager 我应该在这里应用单例模式还是将其所有方法设为静态 我将使用这个 DBManager 进
  • AffineTransform.rotate() - 如何同时缩放、旋转和缩放?

    我有以下代码 它可以完成我想要绘制一个上面有一些棋子的棋盘的 第一部分 Image pieceImage getImage currentPiece int pieceHeight pieceImage getHeight null dou
  • MediaPlayer.create() 始终返回 null

    我以前用过媒体播放器 从来没有遇到过这个问题 每当我尝试使用 MediaPlayer create 时 该方法都会给我 null 并且我无法播放声音 我有什么遗漏的吗 public class Game extends Activity p
  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 我需要一个字数统计程序[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要弄清
  • 如何在Java中打印保留2位小数的浮点数?

    我可以用System out print 您可以使用printf http java sun com j2se 1 5 0 docs api java io PrintStream html printf 28java lang Strin
  • 为什么下面代码的输出是Thread[main,5,main]

    public class test1 public static void main String args TODO Auto generated method stub Thread t Thread currentThread Sys
  • Elasticsearch - EdgeNgram + 突出显示 + term_vector = 不好的突出显示

    当我使用带有edgengram min 3 max 7 front term vector with positions offsets的分析器时 文档包含文本 CouchDB 当我搜索 couc 时 我的亮点是 cpu 而不是 couc
  • Java LRU 缓存使用 LinkedList

    堆栈溢出的新手 所以请不要介意我以菜鸟的方式问这个问题 我正在尝试使用链表实现 LRU 缓存 我在这里看到了使用 linkedHashMap 和其他数据结构的其他实现 但对于这种情况 我正在尝试使用链表创建最佳优化版本 正如我在技术期间被问
  • 如何在Java中模拟引用传递?

    我是一个十足的 Java 菜鸟 我知道 Java 将所有参数视为按值传递 并且还有其他几个线程人们对此进行了解释 例如 在 C 中我可以这样做 void makeAThree int n n 3 int main int myInt 4 m
  • javax.xml.bind.JAXBException: 类 *** 及其任何超类在此上下文中均未知

    我正在尝试通过 REST Web 服务传递对象 以下是我的课程 使用一些示例代码解释了我需要的功能 Rest Web 服务类方法 POST Path find Consumes MediaType APPLICATION FORM URLE
  • 如何在速度模板中检索哈希图值

    如何从速度模板中的以下哈希图中检索值 请帮忙 LinkedHashMap
  • while 之后无法访问的语句[重复]

    这个问题在这里已经有答案了 我只是修改代码 在以下代码中出现错误 int x 1 System out println x x while true x System out println x x 错误在最后一行 我可以知道错误 错误 无
  • Lucene/Hibernate 搜索锁定异常

    我使用 Hibernate Search 在 Web 应用程序上索引和全文搜索项目 没有问题 来自我的 pom xml
  • 在没有EOF的情况下停止读取java中的输入

    In 问题 如何停止读取输入 我的程序继续运行 要求更多输入 public static void main String args throws Exception BufferedReader br new BufferedReader

随机推荐

  • Unity mlagent中强化学习ppo算法的参数怎么设置?

    Unity ML Agents的PPO算法参数可以通过设置ML Agents的Hyperparameter设置来调整 具体有 batch size discount gae lambda learning rate entropy coef
  • 2022尚硅谷阳哥docker篇之Portainer的监控三剑客

    docker compose yml文件 version 3 1 volumes grafana data services influxdb image tutum influxdb 0 9 restart always environm
  • 戴尔,更换固态硬盘后no bootable devices found

    注意 操作之前要备份 备份 备份 更换固态硬盘后 出现no bootable devices found 可以尝试一下这个方法 https www zhihu com question 299594649 answer 1565769605
  • 机器人学:(1)机器人基础

    1 1 机器人机构 机器人的机械机构由一系列刚性构件 连杆 通过链接 关节 联结起来 机械臂的特征在于具有用于保证可移动性的臂 arm 提供灵活性的腕 wrist 和执行机器人所需完成任务的末端执行器 end effector 机器人分为串
  • TS:etcd集群某个etcd实例启动报错(报cluster ID mismatch)-2022.10.13(已解决)

    目录 文章目录 目录 1 报错现象 2 排查过程 3 解决过程 1 尝试办法1 2 尝试办法2 4 总结 引用 关于我 最后 1 报错现象 在k8s高可用集群搭建过程中 关于etcd集群搭建是 报错了 自己当时环境如下 本次复用3个node
  • Java基础题

    面向对象程序设计期末复习之手写代码 Java编程基础 1 定义一个整型的长度为6的一维数组k 6 并将数组中元素k i 值初始化为i 然后 将元素k 3 打印出来 class test1 public static void main St
  • ISIS简介、NSAP与NET地址、Router-Id转换成NET地址

    2 0 0 ISIS简介 NSAP与NET地址 Router Id转换成NET地址 ISIS简介 IS IS Intermediate System to Intermediate System 中间系统到中间系统 1 该协议最初是ISO国
  • 逆向思维:卡通照片真人化

    之前PaddleGAN的趣味应用如雨后春笋般地出现 非常多的项目都是xxx动漫化 当时就有一个很普通的想法为什么大家都会去搞动漫化 这很可能是因为二次元文化的原因 又或者是动漫化的应用 商业价值 就突然蹦出一个想法 为什么没人弄动漫真人化呢
  • free vs delete简洁版

    free释放的是指针指向的内存 回归到操作系统的空闲内存链表中 之后还需要程序员手动将对应的指针赋值成为NULL 不然那个指针还在 并且还指向那个内存 delete是调用的是对应的new 的变量的析构函数 delete对应new delet
  • 出现 Request Entity Too Large问题的解决方法

    根据经验判断应该是上传文件大小被限制了 检查了应用配置是10M 把它设置成100M 重启服务也不能解决问题 原来我们的tomcat是通过nginx发现服务代理的 问题就出现nginx服务器上 原来nginx默认长传文件的大小是1M 可在ng
  • VMware安装系统时“无法创建新虚拟机: 不具备执行此操作的权限“的解决方案

    VMware安装系统时 无法创建新虚拟机 不具备执行此操作的权限 的解决方案 参考文章 1 VMware安装系统时 无法创建新虚拟机 不具备执行此操作的权限 的解决方案 2 https www cnblogs com kailugaji p
  • Python_爬虫复习_爬取直播间弹幕生成词云图

    爬取直播间弹幕 生成词云图 一 环境准备 安装相关第三方库 pip install jieba pip install wordcloud 二 数据准备 爬取对象 2021年5月23号 RNG夺冠直播间的弹幕信息 爬取对象路径 方式1 根据
  • 使用淘宝npm源安装electron7.x.x版本报错的问题

    windows 与 linux 一样 修改用户目录下 npmrc 文件 registry https registry npm taobao org sass binary site https npm taobao org mirrors
  • Unity Animation动画循环播放时卡顿、不连贯问题解决办法

    一 动画卡顿 如上图 可看到 当循环播放动画时 动画像瘸了似的 一会块 一会慢 总之就是不连贯 二 解决办法 打开该元素对应的Animation 然后选中下方的Curves动画曲线 在这里我们可以看到 该动画是一条S型曲线 故而播放速度才会
  • vs2019+pcl1.10.1一劳永逸配置

    不同pcl版本的安装配置有微小差异 低版本要稍微复杂一点 建议选择跟博客一样的配置 防止奇奇怪怪的错误 本次配置是windows vs2019 pcl1 10 1 1 下载pcl1 10 1 Release pcl 1 10 1 Point
  • Nacos Config远程配置读取失败

    项目场景 测试Springboot整合RabbitMQ的时候 使用Nacos做远程配置中心 问题描述 使用Nacos做远程配置中心 在bootstrap yml中已经配置好相关信息如下 spring application name rab
  • C语言三级指针

    C语言 三级指针的应用 http www cnblogs com zhanggaofeng p 5498218 html 三级指针的应用场景 https blog 51cto com wait0804 1874777 三级指针四级存储空间的
  • Android Studio 点击按钮跳转到另一个Activity

    there 一 前言 二 前置工作 2 1创建新的界面和按钮 2 2 绑定按钮 三 intent进行连接并跳转 四 总结 一 前言 最近才开始使用Android Studio 不太熟悉 用博客记录一下 二 前置工作 2 1创建新的界面和按钮
  • python的全局解释锁(GIL)

    一 介绍 全局解释锁 Global Interpreter Lock GIL 是在某些编程语言的解释器中使用的一种机制 在Python中 GIL是为了保证解释器线程安全而引入的 GIL的作用是在解释器的执行过程中 确保同一时间只有一个线程可
  • 集合中常用方法的使用

    集合中常用方法的使用 文章目录 数组和List之间的转化 数组转化为List List转化为数组 包装类型的数据转化 list gt array 注 只能转化到包装类 array gt list 注 只能用包装类转化 数组基本类型和包装类之