1.map双列集合,每一个集合分为值和键两个部分组成,是一个键值对的关系-对应关系(映射关系);map中的键是唯一且无序的
键:key;值:value;键值对:entrySet
2.常用方法
3.
4.collections是静态工具类
5.当集合里面装的是对象时,用collections.sort()排序
4.
可变参数
什么是方法签名?
* main(String[] args) - 方法签名
* 包含方法名和参数列表
- 可变参数的优点:使参数列表更加灵活
- 可变参数:参数的数量可变!
注意:
- 1.数据类型…代表可变参数,即可以传入任意个该类型的数据
- 2.可变参数不能放在前面,只能放在后面
- 3.可变参数的方法与数组的方法不能重载,因为可变参数就是一个数组
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
/**
* 讲解方法的可变参数
*
*/
public class ArgsDemo {
public static void main(String[] args) {
//利用父类的接口创建对象
Collection<String> c = new ArrayList<>();
//添加数据 - 调用方法
Collections.addAll(c,"黄药师","段誉","虚竹");//jvm会自动将多个参数封装成一个数组
System.out.println(c);
System.out.println("--------------------------------");
//自定义一个方法 - 可以灵活的处理参数列表
int sum = add(10, 20, 50, 88);
System.out.println("sum="+sum);
System.out.println("--------------------------------");
int[] arr = {10,20,50,88};
int sum2 = add(arr);
System.out.println("sum2="+sum2);
}
//封装一个灵活参数的方法
public static int add(int...a){
//声明变量,记录所有数字的和
int sum = 0;
//变量数组 - 参数列表数组
for (int i = 0; i < a.length; i++) {
int j = a[i];
System.out.println("j="+j);
//没遇到一个数字就累加
sum += j;
}
return sum;
}
/**
* 可变参数其实就是一个数组
* 这里int[]其实就和int...是一样的,所以jvm判断为两个方法一样,并不是重载
* public static int add(int[] arr){
* return 0;
* }
*/
}
数组与集合的相互转换
Arrays工具类
Arrays是一个工具类 - 专门服务于数组的 - 是一个静态类
toString()其实就是在Arrays中重写了Object中的方法
**
数组转成集合
Java数组的特点:
1.一旦声明不能修改长度
2.存放的元素只能是当前声明的数据类型
java集合的特点:
1.长度任意改变
2.存放的元素可以是任意类型 - 包装类
数组转成集合的方法:
public static *
*注意:数组转换成集合后,该集合就不支持添加或删除操作,否则会抛出异常
集合转成数组:
public
import java.util.ArrayList;
import java.util.Arrays;
/**
* 集合转换为数组:
* public <T> T[] toArray(T[] a);
* public Object[] toArray(); - 集合转换为数组
*
*
* 总结:
* 1.当数组转为集合的时候要注意:不能进行添加和删除的操作 - 遵循数组的结构规则
* 2.当集合转为数组的时候要注意:数据类型的强制转型或者泛型的使用
* 3.数组转为集合 - 从小到大
* 集合转为数组 - 从大到小
*/
public class ArrayListToArrayDemo {
public static void main(String[] args) {
//声明一个集合
ArrayList<Integer> list = new ArrayList<>();
list.add(10);
list.add(1);
list.add(5);
list.add(7);
list.add(3);
//调用方法 - 将集合转换为Object类型的数组
Object[] objArr = list.toArray();
System.out.println(Arrays.toString(objArr));
//向下转型
Integer i = (Integer) objArr[0];
System.out.println(i.intValue());
System.out.println("-------------------------");
//调用方法,将集合转换为带类型的数组
Integer[] intArr = new Integer[6];
Integer[] returnArr = list.toArray(intArr);
System.out.println(Arrays.toString(intArr));//[10, 1, 5, 7, 3, null]
System.out.println(Arrays.toString(returnArr));//[10, 1, 5, 7, 3, null]
/*如果给定的数组的长度不足以存放下集合中的元素,这个时候系统会再次自动创建
一个能够存放集合中元素的数组,原来声明好的数组就不用了*/
Integer[] intArr = new Integer[3];
Integer[] returnArr = list.toArray(intArr);
System.out.println(Arrays.toString(intArr));//[null,null,null]
//帶泛型的
Integer integer = returnArr[3];
System.out.println(integer.intValue());//7
}
}
总结:
1.当数组转为集合的时候要注意:不能进行添加和删除的操作 - 遵循数组的结构规则 2.当集合转为数组的时候要注意:数据类型的强制转型或者泛型的使用 3.数组转为集合 - 从小到大 集合转为数组 - __从大到小
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import com.igeek_07.ArrayAsListDemo;
/**
* 重构案例:
*
* ♣♦♠♥ 大☺小☺
* 具体规则:
* 使用54张牌打乱顺序
* 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。
*
* 逻辑分析:
*
* 每张牌由花色数字两部分组成,我们可以使用花色集合与数字集合嵌套迭代完成每张牌的组装。
* 使用一个Map集合,<<将小的数字与小的牌对应起来>>,做成Map集合的键与值
* 即:
* 键:数字
* 值:花色+数字的字符串(牌)
*
* 准备牌:
* 牌可以设计为一个ArrayList<Integer>,每个数字为一张牌。
* 牌由Collections类的shuffle方法进行随机排序。
* 发牌:
* 将每个人以及底牌设计为ArrayList<Integer>,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。
* 看牌:
* 将所有集合排序Collections类的sort方法进行排序
* 将每个集合的数字依次找到对应的纸牌字符串打印出来
*/
public class CardDemo {
public static void main(String[] args) {
//确定牌和数字的对应关系
Map<Integer, String> map = new HashMap<>();
//花色集合
ArrayList<String> colors = new ArrayList<>();
colors.add("♣");
colors.add("♦");
colors.add("♠");
colors.add("♥");
//数字集合
ArrayList<String> numbers = new ArrayList<>();
for(int i=3; i<=10; i++){
numbers.add(i + "");
}
//添加其他的牌
Collections.addAll(numbers, "J","Q","K","A","2");
//设置对应关系
int cardNumber = 0;
//遍历数字集合,使用每一种颜色匹配每一个花色
for(String thisNumber : numbers){
//使用数字匹配花色
for(String thisColor : colors){
String thisCard = thisColor + thisNumber;
//放入map
map.put(cardNumber, thisCard);
//对应成功一个就累计
cardNumber++;
}
}
//添加大小王
map.put(cardNumber++, "大☺");
map.put(cardNumber++, "小☺");
//测试
//System.out.println(map);
//准备牌
ArrayList<Integer> poker = new ArrayList<>();
for(int i=0;i<54;i++){
poker.add(i);
}
//System.out.println(poker);
//制造下标,目的是为了打乱顺序
Collections.shuffle(poker);
//发牌
ArrayList<Integer> player01 = new ArrayList<>();
ArrayList<Integer> player02 = new ArrayList<>();
ArrayList<Integer> player03 = new ArrayList<>();
ArrayList<Integer> dipai = new ArrayList<>();
for(int index=0;index<poker.size()-3;index++){
//通过索引,获取代表牌的数字
Integer integerCard = poker.get(index);
//对3取余
if(index%3==0){
player01.add(integerCard);
}else if(index%3==1){
player02.add(integerCard);
}else{
player03.add(integerCard);
}
}
//最后的三张底牌
for(int index=poker.size()-3;index<poker.size();index++){
Integer integerCard= poker.get(index);
dipai.add(integerCard);
}
//看牌 - 排序
Collections.sort(player01);
Collections.sort(player02);
Collections.sort(player03);
Collections.sort(dipai);
//从小到大进行排序
for(int i=player01.size()-1; i>0; i--){
Integer integer = player01.get(i);
String realCard = map.get(integer);
System.out.print(realCard + " ");
}
//换行
System.out.println();
for(int i=player02.size()-1; i>0; i--){
Integer integer = player02.get(i);
String realCard = map.get(integer);
System.out.print(realCard + " ");
}
//换行
System.out.println();
for(int i=player03.size()-1; i>0; i--){
Integer integer = player03.get(i);
String realCard = map.get(integer);
System.out.print(realCard + " ");
}
//换行
System.out.println();
//增强for
for(Integer integer : dipai){
String realCard = map.get(integer);
System.out.print(realCard + " ");
}
}