美文网首页
java基础系列07--集合(3)

java基础系列07--集合(3)

作者: addin_gao | 来源:发表于2019-01-14 09:37 被阅读6次

JAVA 集合三

Map集合

java.util 下的接口Map<K,V>,将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值

Map接口和Collection接口的不同:

  • Map是双列的,Collection是单列的
  • Map的键唯一,Collection的子体系Set是唯一的
  • Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效

HashSet底层依赖于Map,HashSet只是隐藏了Map的值部分,只显示键部分

public boolean add(E e) {
    return map.put(e, PRESENT)==null; // HashSet的add方法使用了Map
}

Map集合的部分方法:

public static void main(String[] args){
       Map<String,Integer> map = new HashMap<>();
       // 添加功能
       Integer i = map.put("张三", 23);
       Integer i1 = map.put("张三", 12);
       Integer i2 = map.put("李四", 12);
       System.out.println(i);  // null
       System.out.println(i1); // 23  ,现在张三的值为12
       System.out.println(map);// {李四=12, 张三=12}
       
       // 删除功能
       // map.clear(); // 删除所有集合
       // Integer i3 = map.remove("张三");
       // System.out.println(i3); // 12  根据key删除,返回key对应的值
       
       // 判断功能
       boolean b1 = map.containsKey("张三"); //判断集合是否包含key
       boolean b2 = map.containsValue(12); // 判断集合是否包含value
       boolean b3 = map.isEmpty(); // 判断集合是否为空
       
       // 获取功能
       Collection<Integer> c = map.values(); // 获取Map集合所有value,返回一个Collection集合 
       System.out.println(c);//[12, 12]
       Integer i5 = map.get("张三"); // 12 根据健获取值
       
       // 获取长度
       System.out.println(map.size()); // 2 
}

Map集合的遍历:

public class names {
    public static void main(String[] args){
        Map<String,Integer> hm = new HashMap<>();
        hm.put("zhangsan", 12);
        hm.put("lisi", 14);
        hm.put("zhangsan", 18);
        hm.put("wangwu", 14);
        System.out.println(hm); // {lisi=14, zhangsan=18, wangwu=14}
        
//      第一种遍历方式:通过key获取值
        Set<String> sh = hm.keySet();
        Iterator<String> is = sh.iterator();
        while(is.hasNext()){
            String key = is.next();
            Integer value = hm.get(key);
            System.out.println(value); // 14 18 14
        }
//      第二种增强for循环(常用)
        for (String key : sh) {
            System.out.println("key="+ key + " value="+hm.get(key));
        }
        
//      第三种迭代,返回一个对象,通过对象获取键和值
//      Map.Entry说明Entry是Map的内部接口,将键和值封装成了Entry对象并存储在Set集合中
        Set<Map.Entry<String, Integer>> entrySet = hm.entrySet();
        // 获取每一个对象
        Iterator<Map.Entry<String, Integer>> it = entrySet.iterator();
        while(it.hasNext()){
            // 获取每一个Entry 对象
            Map.Entry<String, Integer> en = it.next();
            System.out.println(en.getKey()+en.getValue());
        }
        
//      第三种迭代的增强for循环迭代方式
        for (Entry<String, Integer> entry : entrySet) {
            System.out.println(entry.getKey()+entry.getValue());
        }
    }
}

LinkedHashMap

底层是链表实现的可以保证怎么存就怎么取

LinkedHashMap<String,Integer> lhm = new LinkedHashMap<>();
lhm.put("zhangsan", 12);
lhm.put("lis", 12);
lhm.put("wangwu", 12);
System.out.println(lhm);

TreeMap

public static void main(String[] args){
        TreeMap<Animal,Integer> tm = new TreeMap<>();
        tm.put(new Animal(11,"张三"), 11);
        tm.put(new Animal(14,"赵六"), 14);
        tm.put(new Animal(15,"王五"), 15);
        tm.put(new Animal(10,"李四"), 10);
        System.out.println(tm);  // 按照10 11 14 15的排序 传比较器比较常见
      
}
class Animal implements Comparable<Animal>{
    private int age;
    private String name;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Animal(){}
    public Animal(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }
    @Override
    public int compareTo(Animal o) {
        int num  =this.age - o.age;  // 以年龄排序第一位
        return num == 0? this.name.compareTo(o.name): num; //  以姓名排序第二
    }
    @Override
    public String toString() {
        return "Animal [age=" + age + ", name=" + name + "]";
    }   
}

试题:统计一串字符串字符出现的次数:

public static void main(String[] args){
        String str = "abcdddcsdfsdfdfeweewrwedddddd";
        Map<Character,Integer> map = new HashMap<>();
        // 将字符串变为字符数组
        char[] charArr = str.toCharArray();
        for (char c : charArr) {
            map.put(c, map.containsKey(c)?map.get(c)+1:1);
        }
        
        // Set<Character> totle = map.keySet(); 两个步骤合二为一
        for (Character c : map.keySet()) {
            System.out.println(c +":"+map.get(c));
        }
}

HashMap和Hashtable的区别

HashMap和Hashtable的区别

  • Hashtable是JDK1.0版本出现的,是线程安全的,效率低,HashMap是JDK1.2版本出现的,是线程不安全的,效率高
  • Hashtable不可以存储null键和null值,HashMap可以存储null键和null值
HashMap<String, Integer> hm = new HashMap<>();
hm.put(null, 12);
hm.put("zhangsan", null);
System.out.println(hm);

Hashtable<String,Integer> ht = new Hashtable<>();
ht.put(null, 12);  //报错 java.lang.NullPointerException
ht.put("zhangsan", null); // java.lang.NullPointerException
System.out.println(ht);

Collections 类工具方法

public static <T> void sort(List<T> list)
        public static <T> int binarySearch(List<?> list,T key)
        public static <T> T max(Collection<?> coll)
        public static void reverse(List<?> list)
        public static void shuffle(List<?> list)

斗地主发牌:

    public static void main(String[] args){
//                  //买一副牌
        String[] num = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        String[] color = {"方片","梅花","红桃","黑桃"};
        HashMap<Integer, String> hm = new HashMap<>();          //存储索引和扑克牌
        ArrayList<Integer> list = new ArrayList<>();            //存储索引
        int index = 0;                                          //索引的开始值
        for(String s1 : num) {
            for(String s2 : color) {
                hm.put(index, s2.concat(s1));                   //将索引和扑克牌添加到HashMap中
                list.add(index);                                //将索引添加到ArrayList集合中
                index++;
            }
        }
        hm.put(index, "小王");
        list.add(index);
        index++;
        hm.put(index, "大王");
        list.add(index);
        //洗牌
        Collections.shuffle(list);
        //发牌
        TreeSet<Integer> gaojin = new TreeSet<>();
        TreeSet<Integer> longwu = new TreeSet<>();
        TreeSet<Integer> me = new TreeSet<>();
        TreeSet<Integer> dipai = new TreeSet<>();
        
        for(int i = 0; i < list.size(); i++) {
            if(i >= list.size() - 3) {
                dipai.add(list.get(i));                         //将list集合中的索引添加到TreeSet集合中会自动排序
            }else if(i % 3 == 0) {
                gaojin.add(list.get(i));
            }else if(i % 3 == 1) {
                longwu.add(list.get(i));
            }else {
                me.add(list.get(i));
            }
        }
        
        //看牌
        lookPoker("高进", gaojin, hm);
        lookPoker("龙五", longwu, hm);
        lookPoker("冯佳", me, hm);
        lookPoker("底牌", dipai, hm);
        
    }
    public static void lookPoker(String name,TreeSet<Integer> ts,HashMap<Integer, String> hm) {
        System.out.print(name + "的牌是:");
        for (Integer index : ts) {
            System.out.print(hm.get(index) + " ");
        }
        
        System.out.println();
    }

相关文章

网友评论

      本文标题:java基础系列07--集合(3)

      本文链接:https://www.haomeiwen.com/subject/raxskqtx.html