Java(八)(可变参数,Collections,小案例:斗地主游戏小案例:斗地主游戏,Map集合,Stream流)

目录

可变参数

Collections

小案例:斗地主游戏

Map集合

 Map的常用方法

map集合的遍历

键找值

键值对

Lambda 表达式

HashMap底层原理

集合的嵌套

Stream流

获取集合或数组的Stream流

Stream流的方法


可变参数

就是一种特殊的形参,定义在方法和构造器的形参列表中,格式是: 数据类型...参数名称

外部可以接受多个该类型的参数,也可以接收这个参数的数组

而他的内部是一个数组

一个形参列表只能由一个可变参数

可变参数要放到形参列表的后面

public class zheng {public static void main(String[] args) {test(); // 不传数据test(10); // 传一个数据给它test(10,20,30); // 传输多个数据给他test(new int[]{10,20,30,40,50}); // 传输一个数组给可变参数}public static void test(int...number) {// 可变参数在方法内部,本质上是一个数组System.out.println(number.length);System.out.println(Arrays.toString(number));System.out.println("---------------------");}
}

Collections

工具类: 类名.方法  有static修饰的

public class zheng {public static void main(String[] args) {// 1.public static <T> boolean addAll(Collection<? super T> c,T...elements):// 为集合批量添加数据List<String> names = new ArrayList<>();Collections.addAll(names, "张三","王五","李四","张麻子");System.out.println(names);// 2.public static void shuffle(List<?> list) 打乱List集合中的元素顺序Collections.shuffle(names);System.out.println(names);// 3.public static <T> void sort(List<T> list) 对List集合中的元素进行升序排序List<Integer> list = new ArrayList<>();list.add(3);list.add(5);list.add(2);Collections.sort(list);System.out.println(list);}
}

 下面时设置表示方法

// 比较的对象不能排序的时候,那就方法重写List<Student>Student = new ArrayList<>();Student.add(new Student("李小谦",18,100));Student.add(new Student("李玉刚",58,90));Student.add(new Student("李德华",48,60));Collections.sort(Student);System.out.println(Student);// 实现接口的匿名内部类Collections.sort(Student, new Comparator<bag5.Student>() {@Overridepublic int compare(bag5.Student o1, bag5.Student o2) {return Double.compare(o1.getScore(),o2.getScore());}});

上面的方法1在Student中的实现类是

上面就是相当于用sort方法的时候,给出了Student具体按照什么指标来排序

小案例:斗地主游戏

main类

package bag5;import org.w3c.dom.ls.LSOutput;import java.sql.SQLOutput;
import java.util.*;
import java.util.function.Consumer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class zheng {public static void main(String[] args) {// 1.牌类// 2.房间// 3.创建一个房间Room room = new Room();// 3.启动游戏room.start();}}

创建一个Card类,用来创建Card对象

package bag5;public class Card {private String color;private String number;private int size;public Card() {}public Card(String color, String number, int size) {this.color = color;this.number = number;this.size = size;}@Overridepublic String toString() {return color+number;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public int getSize() {return size;}public void setSize(int size) {this.size = size;}
}

创建一个房间类

package bag5;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class Room {// 必须有一副牌private List<Card> allCards = new ArrayList<>();List<Card> lingHuChong = new ArrayList<>();List<Card> lixiaoqian = new ArrayList<>();List<Card> zhangsanfeng = new ArrayList<>();public Room(){// 1. 做出54张牌,存入集合allCards// a. 点数: 个数确定,类型确定String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};String[] colors = {"♥","🖤","♣","♦"};int size = 0;for(String number: numbers){size++;for(String color:colors){Card c = new Card(number,color,size);allCards.add(c);}}// 单独存入小大王Card c1 = new Card("","小王",++size);Card c2 = new Card("","大王",++size);Collections.addAll(allCards,c1,c2);System.out.println(allCards);}public void start(){// 1. 洗牌: allCardsCollections.shuffle(allCards);System.out.println("洗牌后: "+ allCards);// 2. 发牌: 首先定义三个玩家(ArrayList)for (int i = 0; i < allCards.size() - 3; i++) {Card c = allCards.get(i);if (i % 3 == 0){lingHuChong.add(c);}else if(i%3 == 1){lixiaoqian.add(c);}else {zhangsanfeng.add(c);}}// 底牌List<Card> lastTreeCards = allCards.subList(allCards.size() - 3,allCards.size());//对排进行排序sortCards(lixiaoqian);sortCards(lingHuChong);sortCards(zhangsanfeng);lixiaoqian.addAll(lastTreeCards);System.out.println(lixiaoqian);System.out.println(lingHuChong);System.out.println(zhangsanfeng);}private void sortCards (List<Card> cards ){Collections.sort(cards, new Comparator<Card>() {@Overridepublic int compare(Card o1, Card o2) {return o1.getSize() - o2.getSize();}});}}

Map集合

称为双列集合,格式: {key1 = value1,key2=value2}一次需要存一对数据作为一个元素

Map集合的每个元素,"key=value"称为一个键值对/键值对对象/一个Entry对象

Map集合所有键是不允许重复的,但值可以重复,键和值一一对应,每一个键都有自己对应的值

public class map11 {public static void main(String[] args) {Map<String,Integer> map = new HashMap<>();map.put("手表",100);map.put("手表",10);// 后面重复的数据会覆盖前面的数据map.put("手帕",1200);map.put("电脑",300);map.put("手机",500);System.out.println(map);}
}

 Map的常用方法

public class map11 {public static void main(String[] args) {Map<String,Integer> map = new HashMap<>();map.put("手表",100);map.put("手表",10);// 后面重复的数据会覆盖前面的数据map.put("手帕",1200);map.put("电脑",300);map.put("手机",500);System.out.println(map);// 获取集合的大小System.out.println(map.size());// 清空map.clear();System.out.println();// 判断是否为空System.out.println(map.isEmpty());// 获取键对应的值int v1 = map.get("手表");System.out.println(v1);System.out.println(map.get("手机"));System.out.println(mao.get("李小谦"));// public V remove (Object key) 根据键删除整个元素(删除键会返回键的值)System.out.println(map.remove("手表"));System.out.println(map);// public boolean containsKey(Object key)  判断是否包含某个值System.out.println(map.containsKey("手表"));System.out.println(map.containsKey("手机"));System.out.println(map.containsKey("Java"));System.out.println(map.containsKey("java"));// public boolean containValue(Object value): 判断是否包含某个键System.out.println(map.containsValue(100));// public Set<K> keySet 获取Map集合中全部键Set<String> set = map.keySet();System.out.println(set);// public Collection<V> values() 获取Map集合中的全部值Collection<Integer> list = map.values();System.out.println(list);// 把其他map数据倒入自己集合中Map<String,Integer>map1 = new HashMap<>();map1.put("java",10);map1.put("python",100);Map<String,Integer>map2 = new HashMap<>();map2.put("java",20);map2.put("C++",100);}
}

map集合的遍历

键找值

大体思路就是,将键取出来封装成一个Set对象,然后遍历Set中的键去get到Map中的值

public class map11 {public static void main(String[] args) {Map<String,Double> map = new HashMap<>();map.put("蜘蛛精",162.5);map.put("蜘蛛精",169.8);map.put("紫霞",165.8);map.put("至尊宝",169.5);map.put("牛魔王",183.6);System.out.println(map);// 1. 获取Map集合的全部键Set<String> keys = map.keySet();System.out.println(keys);// 2. 遍历全部的键,根据键获取对应的值for (String key : keys) {Double value = map.get(key);System.out.println(value.doubleValue());System.out.println(key + "====>" + value);}}
}

键值对

将"键值对"看成一个整体进行遍历

public class map11 {public static void main(String[] args) {Map<String,Double> map = new HashMap<>();map.put("蜘蛛精",162.5);map.put("蜘蛛精",169.8);map.put("紫霞",165.8);map.put("至尊宝",169.5);map.put("牛魔王",183.6);System.out.println(map);Set<Map.Entry<String,Double>> set= map.entrySet();for (Map.Entry<String, Double> stringDoubleEntry : set) {String key = stringDoubleEntry.getKey();double value = stringDoubleEntry.getValue();System.out.println(key+ "----->"+ value);}}
}

Lambda 表达式

public class map11 {public static void main(String[] args) {Map<String,Double> map = new HashMap<>();map.put("蜘蛛精",162.5);map.put("蜘蛛精",169.8);map.put("紫霞",165.8);map.put("至尊宝",169.5);map.put("牛魔王",183.6);System.out.println(map);map.forEach((k,v)->{System.out.println(k+"---->"+v);});map.forEach(new BiConsumer<String, Double>() {@Overridepublic void accept(String k, Double v) {System.out.println(k+"---->"+v);}});}
}

HashMap底层原理

集合的嵌套

集合的元素又是一个集合

public class map11 {public static void main(String[] args) {Map<String,List<String>> map = new HashMap<>();List<String> cities1 = new ArrayList<>();Collections.addAll(cities1,"南京市","扬州市","苏州市","无锡市","常州市");map.put("江苏省",cities1);List<String> cities2 = new ArrayList<>();Collections.addAll(cities2,"武汉市","孝感市","宜昌","鄂州市","三峡市");map.put("湖北省",cities2);System.out.println(map);List<String> cities = map.get("湖北省");for (String city : cities) {System.out.println(city);}map.forEach((p,c)->{System.out.println(p+"*******"+c);});}
}

Stream流

获取集合或数组的Stream流

public class map11 {public static void main(String[] args) {// 1. 获取ArrayList的stream流List<String> names = new ArrayList<>();Collections.addAll(names,"李小谦","李玉刚","张三","罗翔");Stream<String> stream = names.stream();// 2.获取Set集合中的Stream流Set<Integer> set = new HashSet<>();Collections.addAll(set , 4,5,6,7,8);Stream<Integer> stream1 = set.stream();stream1.filter(s->(s%2 == 0)).forEach(s-> System.out.println(s));// 3. 获取Map集合的Stream流Map<String,Double> map = new HashMap<>();map.put("古力娜扎",172.6);map.put("迪丽热巴",175.2);map.put("欧阳娜娜",173.2);// map.stream();// 拿到键的Stream流Set<String> keys= map.keySet();Stream<String> ks = keys.stream();// 拿到值的Stream流Collection<Double> values = map.values();Stream<Double> vs = values.stream();// 键值对的Stream流Set<Map.Entry<String,Double>> entries = map.entrySet();Stream<Map.Entry<String,Double>> kvs = entries.stream();kvs.filter(e->e.getKey().contains("巴")).forEach(e-> System.out.println(e.getKey() + "-----" + e.getValue()));// 数组中的Stream流String[] names2 = {"张翠山","东方不败","堂大山","独孤九剑"};Stream<String> s1 = Arrays.stream(names2);Stream<String> s2 = Stream.of(names2);}
}

Stream流的方法

先设置一个学生类

package bag6;import java.util.Objects;public class Student implements Comparable<Student>{// 实现这个结构就是调用排序的时候,排序的方法知道了比较规则// this  o@Overridepublic int compareTo(Student o) {// 如果认为左边对象大于右边对象返回正整数//如果认为左边对象小于右边对象返回负数// 如果认为左边等于右边返回0// this表示调用的,o表示被比较的return this.age - o.age;}private String name;private int age;private double Height;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", Height=" + Height +'}';}// 去重的时候按照值去重,不看hashCode@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Double.compare(student.Height, Height) == 0 && Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name, age, Height);}public Student() {}public Student(String name, int age, double score) {this.name = name;this.age = age;this.Height = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getScore() {return Height;}public void setScore(double score) {this.Height = score;}
}

常用方法

public class map11 {public static void main(String[] args) {List<Double> scores = new ArrayList<>();Collections.addAll(scores,88.5,100.0,60.0,99.0,9.5,99.6);// 需求1: 找出成绩大于60分的数据,并升序后,再输出List<Double> S = scores.stream().filter(s->s>60).collect(Collectors.toList());Student s1 = new Student("蜘蛛精",26,172.5);Student s2 = new Student("蜘蛛精",26,172.5);Student s3 = new Student("紫霞",23,167.6);Student s4 = new Student("白晶晶",25,169.0);Student s5 = new Student("牛魔王",35,183.3);Collection<Student> ls = new ArrayList<>();Collections.addAll(ls,s1,s2,s3,s4,s5);// 需求2:找出年龄大于等于23,且年龄小于等于30的学生,并按照年龄降序输出
//        List<Student> st = ls.stream().filter(s ->s.getAge()>=23 && s.getAge()<=30).sorted(new Comparator<Student>() {
//            @Override
//            public int compare(Student o1, Student o2) {
//                return o2.getAge()-o1.getAge();
//            }
//        }).collect(Collectors.toList());
//        System.out.println(st);// 需求3:取出身高的前三3名学生,并输出
//        ls.stream().sorted(new Comparator<Student>() {
//            @Override
//            public int compare(Student o1, Student o2) {
//                return Double.compare(o2.getScore(),o1.getScore());
//            }
//        }).limit(3).forEach(s-> System.out.println(s));//需求4: 取出身高倒数的2名学生,并输出
//        ls.stream().sorted((o1, o2) -> Double.compare(o2.getScore(),o1.getScore()))
//                .skip(ls.size()- 2).forEach(s-> System.out.println(s));// 需求5 : 找出身高超出169的学生叫什么名字,要求去除重复的名字,再输出ls.stream().filter(s->s.getScore()>168).distinct().forEach(s-> System.out.println(s));}
}

终结方法

public class map11 {public static void main(String[] args) {Student s1 = new Student("蜘蛛精",26,172.5);Student s2 = new Student("蜘蛛精",26,172.5);Student s3 = new Student("紫霞",23,167.6);Student s4 = new Student("白晶晶",25,169.0);Student s5 = new Student("牛魔王",35,183.3);Collection<Student> ls = new ArrayList<>();Collections.addAll(ls,s1,s2,s3,s4,s5);// 需求1:请计算出身高超过168的学生有几个人long st = ls.stream().filter(s->s.getHeight()>168).count();System.out.println(st);// 需求2: 请找出身高最高的学生对象Optional<Student> s = ls.stream().max(( o1, o2) ->Double.compare(o1.getHeight() , o2.getHeight()));System.out.println(s);// 需求3 : 请找出身高超过170的学生对象,并返回一个新集合中List<Student> student1 = ls.stream().filter(m ->m.getHeight()>170).collect(Collectors.toList());System.out.println(student1);// 需求4 : 找出身高超过170的学生对象,并把学生对象名字和身高存到一个Map集合中Map<String,Double> m1 = ls.stream().filter(q->q.getHeight()>170).distinct().collect(Collectors.toMap(w->w.getName(),w->w.getHeight()));System.out.println(m1);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小吉和希亦内衣洗衣机选哪个好?小型洗衣机测评对比

在生活质量不断提高的今天&#xff0c;人们对健康、卫生的要求也日益提高。内衣是女性的贴身衣物&#xff0c;它的清洁和卫生是非常重要的。尤其是小孩的衣服&#xff0c;毛巾&#xff0c;袜子等要分开洗&#xff0c;这样就不会和大人的衣服一起洗了&#xff0c;更加的卫生和方…

Android 虚拟机与类加载机制

1、Dalvik 虚拟机 Android 应用程序运行在 Dalvik/Art 虚拟机上&#xff0c;并且每一个应用程序都有一个单独的 Dalvik/Art 虚拟机实例。 1.1 JVM 与 Dalvik Dalvik 虚拟机也算是一个 Java 虚拟机&#xff0c;它是按照 JVM 虚拟机规范实现的&#xff0c;二者的特性差不多&am…

机器人制作开源方案 | 网球自动拾取机

作者&#xff1a;柳文浩、李浩杰、苏伟男、贾思萌、张天芸 单位&#xff1a;西安外事学院 指导老师&#xff1a;胡宝权、陈小虎 1. 产品说明 1.1 设计目的 近年来&#xff0c;网球运动越来越受到老百姓的欢迎&#xff0c;各种规模的比赛层出不穷。然而由于网球运动极为激烈…

Python3基础

导包 在 python 用 import 或者 from...import 来导入相应的模块。 将整个模块(somemodule)导入&#xff0c;格式为&#xff1a; import somemodule 从某个模块中导入某个函数,格式为&#xff1a; from somemodule import somefunction 从某个模块中导入多个函数,格式为&#…

C++基础 -4- C/C++混合编程

引用格式(图片代码段呈现) extern "C" {#include "string.h" }代码验证 &#xff08;分别使用了C/C 的标准输出&#xff09; #include "iostream"using namespace std;extern "C" { #include "stdio.h" #include "…

Win11修改用户名(超详细图文)

新买的电脑一般预装Windows11系统&#xff08;家庭与学生版&#xff09;&#xff0c;新电脑初次开机使用微软邮箱账号登录&#xff0c;则系统将用户名自动设置成邮箱前5位字符。我的用户名便是一串数字【231xx】&#xff08;qq邮箱前5位&#xff09;&#xff0c;看着很不舒服&a…

属性级情感分析

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 属性级情感分析 简介数据集介绍数据加载和预处理&#xff08;data_utils.py&#xff09;预训练模型&#xff08;skep&#xff09;模型定义模块&#xff08;model.py&#xff09;训练配置&#xff08;config.py&am…

element 的 Notification 通知,自定义内容

通知事件&#xff1a; // 商户后台通知 MerchantBackgroundNotice() {// 禁止消息通知弹出多条if(this.notifyInstance) {this.notifyInstance.close();}const h this.$createElement; // 创建文本节点this.notifyInstance this.$notify({showClose: false, // 禁止关闭按钮…

vue随意置换页面元素位置

写在前面&#xff0c;博主是个在北京打拼的码农&#xff0c;从事前端工作5年了&#xff0c;做过十多个大大小小不同类型的项目&#xff0c;最近心血来潮在这儿写点东西&#xff0c;欢迎大家多多指教。 对于文章中出现的任何错误请大家批评指出&#xff0c;一定及时修改。有任何…

Redis Cluster主从模式详解

在软件的架构中&#xff0c;主从模式&#xff08;Master-Slave&#xff09;是使用较多的一种架构。主&#xff08;Master&#xff09;和从&#xff08;Slave&#xff09;分别部署在不同的服务器上&#xff0c;当主节点服务器写入数据时&#xff0c;同时也会将数据同步至从节点服…

图解算法数据结构-LeetBook-树03_层序遍历奇数偶数行方向不同

一棵圣诞树记作根节点为 root 的二叉树&#xff0c;节点值为该位置装饰彩灯的颜色编号。请按照如下规则记录彩灯装饰结果&#xff1a; 第一层按照从左到右的顺序记录 除第一层外每一层的记录顺序均与上一层相反。即第一层为从左到右&#xff0c;第二层为从右到左。 示例 1&…

自动化测试-Selenium

一. Selenium介绍 selenium 是用来做web自动化测试的框架,支持各种浏览器,各种,支持各种语言 原理: 二. 元素定位 2.1 XPath 定位 绝对路径: /html/head/title 相对路径以双斜杠开头,常见的相对路径定位有以下几种: <1>相对路径索引: 索引是从1开始的 <2>相…

探索深度学习:从理论到实践的全面指南

探索深度学习&#xff1a;从理论到实践的全面指南 摘要&#xff1a; 本文旨在提供一个关于深度学习的全面指南&#xff0c;带领读者从理论基础到实践应用全方位了解这一技术。我们将介绍深度学习的历史、基本原理、常用算法和应用场景&#xff0c;并通过Python代码示例和Tens…

讯飞星火知识库文档问答Web API的使用(二)

上一篇提到过星火spark大模型&#xff0c;现在有更新到3.0&#xff1a; 给ChuanhuChatGPT 配上讯飞星火spark大模型V2.0&#xff08;一&#xff09; 同时又看到有知识库问答的web api&#xff0c;于是就测试了一下。 下一篇是在ChuanhuChatGPT 中单独写一个基于星火知识库的内容…

【Android Jetpack】Navigation的使用

引入 单个Activity嵌套多个Fragment的UI架构模式&#xff0c;非常非常普遍。但是&#xff0c;对Fragment的管理一直是一件比较麻烦的事情。工程师需要通过FragmentManager和FragmentTransaction来管理Fragment之间的切换。页面的切换通常还包括对应用程序App bar的管理、Fragme…

[个人笔记] Zabbix实现Webhook推送markdown文本

系统工程 - 运维篇 第四章 Zabbix实现Webhook推送markdown文本 系统工程 - 运维篇系列文章回顾Zabbix实现Webhook推送markdown文本前言实施步骤 Zabbix新增报警媒介类型Zabbix给用户新增报警媒介Zabbix修改动作的执行操作和恢复操作验证&测试 参考来源 系列文章回顾 第一章…

探索RockPlus SECS/GEM平台 - 赋能半导体行业设备互联

SECS/GEM协议&#xff0c;全称为半导体设备通讯标准/通用设备模型&#xff08;SECS/Generic Equipment Model&#xff09;&#xff0c;是一种广泛应用于半导体制造行业的通信协议。它定义了半导体设备与工厂主控系统&#xff08;如MES&#xff09;之间的通信方式&#xff0c;使…

PGP 遇上比特币

重复使用 PGP 密钥作为比特币密钥 介绍 在数字安全领域&#xff0c;密码学在确保数据的完整性和真实性方面发挥着至关重要的作用。 一种广泛使用的加密技术是使用 Pretty Good Privacy (PGP1)。 PGP 为安全通信&#xff08;例如电子邮件、文件传输和数据存储&#xff09;提供加…

解密Spring Cloud微服务调用:如何轻松获取请求目标方的IP和端口

公众号「架构成长指南」&#xff0c;专注于生产实践、云原生、分布式系统、大数据技术分享。 目的 Spring Cloud 线上微服务实例都是2个起步&#xff0c;如果出问题后&#xff0c;在没有ELK等日志分析平台&#xff0c;如何确定调用到了目标服务的那个实例&#xff0c;以此来排…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑氢储一体化协同的综合能源系统低碳优化》

这个标题涉及到考虑了多个方面的能源系统优化&#xff0c;其中关键的关键词包括"氢储一体化"、"协同"、"综合能源系统"和"低碳优化"。以下是对这些关键词的解读&#xff1a; 氢储一体化&#xff1a; 氢储存&#xff1a; 指的是氢气的存…