• Java 集合三 Map相关


    Map

    1、双列集合的的顶层接口(k,v)

    2、描述一个数据到另一个数据的映射

    3、map的特点:

      1、Key是唯一的,value不是惟一的,Value会发生覆盖现象

      2、每个key对应的是唯一的值

    4、map与collection的区别:

      1、map是双列集合,collection是单列集合

      2、map的键唯一,collection的子接口set的元素值唯一

      3、Set的底层结构是map

    5、常用方法:

      1、增 put(K key ,V value)

      2、删 remove(K key) clear()

      3、获取方法 size()  get()

      4、判断方法: containsKey(Object key)  containsValue(V value)

    6、map的遍历

      1、keySet()  得到一个所有key的Set集合,可以通过遍历集合获取键的值

      2、entrySet() 得到一个键值对一体的Set集合(Map.Entry),通过遍历集合,使用getKey()获取键,getValue()获取值

    7、练习

    /*
     * 001 Person(name age)
     * 002 Person(name age)
     *    使用Map的两种遍历方式分别遍历
     */
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;
    
    public class Demo02 {
    
        public static void main(String[] args) {
            Map<String,Person> map = new HashMap<>();
            map.put("001", new Person("qq",20));
            map.put("002", new Person("ww",22));
            map.put("003", new Person("33",32));
            printAll1(map);
            System.out.println("===================");
            printAll2(map);
        }
        public static void printAll1(Map<String,Person> map) {
            Set<String> set = map.keySet();
            for(String i:set) {
                Person p = map.get(i);
                System.out.println(i+" "+"Person("+p.name+" "+p.age+")");
            }
        }
        public static void printAll2(Map<String,Person> map) {
            Set<Entry<String, Person>> set = map.entrySet();
            Iterator<Entry<String, Person>> iterator = set.iterator();
            while(iterator.hasNext()) {
                Entry<String, Person> next = iterator.next();
                System.out.println(next.getKey()+" "+"Person("+next.getValue().name+" "+next.getValue().age+")");
            }
        }
    }
    class Person{
        String name;
        int age;
        public Person(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
    }
    map遍历
    import java.util.Map;
    import java.util.Scanner;
    import java.util.Set;
    import java.util.TreeMap;
    
    /*
     * 键盘录入字符,最后打印成aaabbcccdsflkhdddd  拼接样式使用StringBuilder
     */
    public class Demo03 {
        
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            String s1 = sc.nextLine();
            Map<Character,Integer> map = new TreeMap<Character, Integer>();
            for(int i=0;i<s1.length();i++) {
                if(map.containsKey(s1.charAt(i))) {
                                    //如果键值已经存在,则key值+1
                    map.put(s1.charAt(i), map.get(s1.charAt(i))+1);
                }else {
                    map.put(s1.charAt(i), 1);
                }        
            }
            printAll(map);
            sc.close();
        }
        
        public static void printAll(Map<Character,Integer> map) {
            Set<Character> set = map.keySet();
            StringBuilder sb = new StringBuilder();
            for(Character i:set) {
                sb.append(i+"("+map.get(i)+")");
            }
            System.out.println(sb.toString());
        }
    
    }        
    利用map性质处理字符串

    8、HashMap

      哈希表     HashSet的底层是HashMap  HashSet和HashMap的键一列保证元素唯一的保证方式一样。

      hashCode()  equals()

    9、TreeMap 二叉树

      TreeSet的底层是TreeMap  TreeSet的元素唯一和TreeMap键一列保证元素唯一方式是一致,有两种方式

        一种是元素本身具有比较性

        另一种是集合具有比较性

    10、LinkedHashMap

      是HashMap的子类,存储和取出顺序一致

    11、HashMap和Hashtable的关系

      1.都是使用哈希表来存储数据
      2.不同点:
        1.版本不同:Hashtable jdk1.0 HashMap jdk1.2
        2.线程安全程序不同:Hashtable是线程安全的,HashMap是线程不安全的。
        3.Hashtable不能存储null键和null值,HashMap可以
        4.命名规则不同:Hashtable早期没有形成严格命名规范。

    12、Collections工具类常用方法

      1.binarySearch(List<? extends Comparable<? super T>> list, T key)//使用二分搜索法搜索指定列表,以获得指定对象。
      2.frequency(Collection<?> c, Object o)//返回指定 collection 中等于指定对象的元素数。
      3.max min//最大值、最小值
      4.replaceAll(List<T> list, T oldVal, T newVal)//使用另一个值替换list列表中出现的所有某一指定值
      5.fill(List<? super T> list, T obj)//使用指定元素替换指定列表中的所有元素。
      6.reverse(List<?> list)//反转指定列表中元素的顺序。
      7.shuffle(List<?> list)//使用默认随机源对指定列表进行置换。
      8.swap(List<?> list, int i, int j)//在指定列表的指定位置处交换元素
      9.sort(List<T> list, Comparator<? super T> c) //根据指定比较器产生的顺序对指定列表进行排序。
      10.sort(List<T> list) //根据元素的自然顺序 对指定列表按升序进行排序

    //模拟三人斗地主
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    import java.util.Random;
    import java.util.Set;
    import java.util.TreeSet;
    
    public class PlayPuKe {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            List<String> list = new ArrayList<>();
            String[] str1 = {"黑桃","红桃","梅花","方块"};
            String[] str2 = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
    
            for(int i=0;i<str1.length;i++){
                for(int j=0;j<str2.length;j++) {
                    list.add(str1[i]+str2[j]);
                }
            }
            list.add("大王");
            list.add("小王");
            Collections.shuffle(list);
            playForThree(list);
            
            
        }
        public static void playForThree(List<String> list) {
            Set<String> p1 = new TreeSet<>(new MyCompare());
            Set<String> p2 = new TreeSet<>(new MyCompare());
            Set<String> p3 = new TreeSet<>(new MyCompare());
            Set<String> dipai = new TreeSet<>(new MyCompare());
            add(list,p1,p2,p3,dipai);
            Random r = new Random();
            int result = r.nextInt(3)+1;
            if(result==1) {
                p1.addAll(dipai);
            }else if(result==2) {
                p2.addAll(dipai);
            }else {
                p3.addAll(dipai);
            }
            System.out.println("玩家1:"+p1);
            System.out.println("玩家2:"+p2);
            System.out.println("玩家3:"+p3);
            System.out.println("底牌:"+dipai);
        }
        public static void add(List<String> list,Set<String> s1,Set<String> s2,Set<String> s3,Set<String> s4) {
            for(int i=0;i<51;i+=3) {
                s1.add(list.get(i));
                s2.add(list.get(i+1));
                s3.add(list.get(i+2));
            }
            for(int i=53;i>50;i--) {
                s4.add(list.get(i));
            }
        }
        
    }
    class MyCompare implements Comparator<String>{
        @Override
        public int compare(String o1, String o2) {
            if(o1.length()==3&&o2.length()==3) {
                return new Character(o1.charAt(2)).compareTo(new Character(o2.charAt(2)))>=0?1:-1;
            }else if(o1.length()>3&&o2.length()<=3) {
                return -1;
            }else if(o1.length()<=3&&o2.length()>3) {
                return 1;
            }else{
                return 1;
            }
        }
    }
    模拟三人斗地主练习
  • 相关阅读:
    kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries.
    MYSQL 大数据
    MYSQL 数据库优化
    原始代理需要改进的地方
    JDK动态代理
    使用CGLIB生成代理
    Spring
    Struts2面试题
    hibernate面试题
    Mac下创建隐藏用户
  • 原文地址:https://www.cnblogs.com/xfdhh/p/11217811.html
Copyright © 2020-2023  润新知