Java进阶09(Map集合、Properties属性集、可变参数、斗地主案例优化)

Part 01:Map集合

1、Map集合的特点:

  • 双列集合(Collection是单列集合),元素都是成对存在的
  • Map集合没有迭代器,Map不是继承Collection接口;
  • Map集合元素的键是不能重复的,值可以重复;
  • Collection 一个泛型,Map<K,V>两个泛型,K代表键的类型,V代表值的类型;K,V可以相同,也可以不同,必须是引用类型

2、Map集合的实现类:

  • HashMap(无序):存储数据采用的哈希表结构,元素的存取顺序不能保证一致;由于要保证键的唯一、不重复,需要重写键的hashCode( )方法和equals( )方法;
  • LinkedHashMap(有序):存储数据采用的哈希表结构+链表结构,通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证键的唯一性,需要需要重写键的hashCode( )方法和equals( )方法;

3、Map集合的常用方法:

  • V put(K key,V value);//向集合中添加键值对;如果集合中已存在该键,覆盖整个键值对,并返回被覆盖的键值对的值
  • V remove( Object key);//根据键从Map集合中删除键值对,返回被删除的键值对的值
  • V get(K key);//根据键从Map集合中找到唯一对应的值

4、Map集合遍历方式

  • 以键找值遍历:调用keySet( )方法获取所有的键的集合;用迭代器/foreach遍历所有键的集合,在遍历的过程中获取键对应的值;

    Map<Integer,String> map = new HashMap<Integer, String>(); //添加键值对    
    map.put(1,"小丽丽");
     map.put(2,"中丽丽"); 
     map.put(3,"大丽丽"); 
     map.put(5,"高丽丽"); 
     map.put(4,"丽丽"); 
     Set keys = map.keySet();
     Iterator<Integer> it = keys.iterator(); 
     while (it.hasNext()){
      int key = it.next();
      String value = map.get(key);
      System.out.println(key+":"+value); 
      }
    
  • 键值对遍历:调用entrySet( )方法获取所有键值对对象的集合;遍历这个Set集合调用getKey,getvalue方法获取键和值

    Set<Map.Entry<Integer,String>> entrys = map.entrySet();
    for ( Map.Entry entry:
      entrys) {
     int key = (int) entry.getKey();
     String value = (String) entry.getValue();
      System.out.println(key+":"+value);
    }
    

5、HashMap存储自定义类型键值:
如果Map中的键是自定义类型,那么要保证键的唯一性,必须重写键对应的自定义类的hashCode和equals方法

Part 02:Properties属性集

1、Properties类是什么?

  • class Properties extends HashTable implements Map
    所以:Properties本质上就是一个Map集合
  • Properties是一个持久的属性集
    所谓持久 就是它具有自己写数据到文件的方法;
  • Properties没有泛型/泛型固定<String,String>

2、Properties类的方法:
具有Map接口的一切方法;
还具有以下特有的方法:
* public Object setProperty(String key,String value)//添加键值对;功能和Map中的put方法一致;
* public String getProperty(String key)//用指定的键在此属性列表中搜索属性的值;功能与Map中的get方法一致
* public Set stringPropertyNames( )//返回此属性列表中的键集;功能和Map中的keySet一致

3、Properties具有持久化到文件的功能:
store( );//保存数据到文件;
load( );//从文件中加载数据;

 Properties ps = new Properties();
 ps.setProperty("iphoneX","9888");
 ps.setProperty("xiaomiMix","3288");
 ps.setProperty("huaweiMate11","5800");
 ps.setProperty("vivoX20","2800");

 //把ps的数据持久化到文件中,第一个参数为文件名,一般后缀写成.properties,第二个参数为注释,一般不写
 ps.store(new FileWriter("phones.properties"),"");

 //从文件中读取数据
 ps.load(new FileReader("phones.properties"));
System.out.println(ps);

Part 03:可变参数

1、可变参数:

  • 本质是一个数组;
  • 说的不是参数类型可变,而是参数的个数可以变化;

2、语法:

public 返回值类型 方法名(数据类型…参数名){ }

注意⚠️:

  • 可变参数只是参数的个数是任意个的,参数的类型不能改变

  • 一个方法中,最多只能有一个可变参数

  • 当一个方法中有多个参数,并且有一个参数是可变参数时,这个可变参数必须放最后;

    public  int add(int b,int...a){
       int sum = 0;
      for (int x:
       a) {
      sum=sum+x;
     }
    return sum+b;
    }
    

Part 04:斗地主案例优化

  • 手中的牌按从小到大的顺序排列

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    public class Doudizhu {
      public static void main(String[] args){
          //1.创建编号和牌对应的map集合,编号越大牌越大
          Map<Integer,String> map = new LinkedHashMap<Integer,String>();
          //2.创建牌的编号对应的ArrayList集合
          ArrayList<Integer> arraylist = new ArrayList<Integer>();
          //3.向Map,ArrayList中添加数据
            //编号
          int id = 1;
            //花色和数值
          String[] colors={"♠️","♥️","♣️","♦️"};
          String[] numbers={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
            //生成牌
          for (String num:numbers
               ) {
              for (String color:colors
                   ) {
                  String card = color+num;
                  map.put(id,card);
                  arraylist.add(id);
                  id++;
              }
          }
          map.put(id,"小王");
          arraylist.add(id);
          id++;
          map.put(id,"大王");
          arraylist.add(id);
      //4.洗牌
      Collections.shuffle(arraylist);
    
    
      //5.发牌
      ArrayList<Integer> person1Id = new ArrayList<Integer>();
      ArrayList<Integer> person2Id = new ArrayList<Integer>();
      ArrayList<Integer> person3Id = new ArrayList<Integer>();
      ArrayList<String> remaining = new ArrayList<String>();
       //给三个玩家轮流发牌
      for (int i=0;i<arraylist.size()-3;i++){
          person1Id.add(arraylist.get(i));
          i++;
          person2Id.add(arraylist.get(i));
          i++;
          person3Id.add(arraylist.get(i));
      }
      //剩下的三张底牌
      for (int j=arraylist.size()-3;j<arraylist.size();j++){
          //获取牌的编号
          int remainningId = arraylist.get(j);
          //根据牌的编号找到牌
          String remainingCard = map.get(remainningId);
          //将牌添加到ArrayList中
          remaining.add(remainingCard);
      }
      System.out.println("底牌:"+remaining);
    
      //6.给三个玩家手里的牌排序
      Collections.sort(person1Id);
      Collections.sort(person2Id);
      Collections.sort(person3Id);
    
    
      ArrayList<String> person1Card = new ArrayList<String>();
      ArrayList<String> person2Card = new ArrayList<String>();
      ArrayList<String> person3Card = new ArrayList<String>();
      //7.看牌
      //根据牌的编号从Map集合中获取他的牌
      for (int i:person1Id
           ) {
          String value = map.get(i);
          person1Card.add(value);
      }
      for (int i:person2Id
              ) {
          String value = map.get(i);
          person2Card.add(value);
      }
      for (int i:person3Id
              ) {
          String value = map.get(i);
          person3Card.add(value);
      }
      System.out.println(person1Card);
      System.out.println(person2Card);
      System.out.println(person3Card);
     }
    }
    

结果为:在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值