javaSE (二十七)HashMap和Hashtable的区别、用集合模拟扑克牌斗地主分发与查看、集合总结

1、HashMap和Hashtable的区别:

  • 共同点:底层都是哈希算法,都是双列集合
  • 不同点:
    HashMap是线程不安全的,效率高,JDK1.2版本,可以存储null键和值
    HashMap是线程安全的,效率低,JDK1.0版本,不可以存储null键和值

2、用集合模拟扑克牌斗地主分发与查看:

描述:四个花色 54张牌,三个人,叫地主
思路:既然是集合的最后一篇,自然要做全套(我是说用到全部的集合类,list、set、map)
1、创建牌:用双列集合hashmap存储牌;
2、洗牌:用arraylist存储索引,用collections.shuffer()打乱;
3、看牌:用treeSet来存储索引或者hashmap的值,可以自动排序(为什么要排序,因为好看)

代码:

package cn.xinhua;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeMap;
import java.util.TreeSet;

public class PorkTest {

	public static void main(String[] args) {
		HashMap<Integer, String> hmap = new HashMap<>();// 双列集合存储牌
		ArrayList<Integer> arr = new ArrayList<>(); // 洗牌,就洗索引
		TreeSet<String> one = new TreeSet<>(); // 三个人和底牌
		TreeSet<String> two = new TreeSet<>();
		TreeSet<String> three = new TreeSet<>();
		TreeSet<String> dipai = new TreeSet<>();

		// 创建牌
		String[] num = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
		String[] color = { "红心", "方块", "黑桃", "梅花" };
		int index = 0;
		for (int i = 0; i < color.length; i++) {
			for (int j = 0; j < num.length; j++) {

				hmap.put(index, num[j].concat(color[i]));
				arr.add(index);
				index++;

			}
		}

		int a = index++;
		int b = index++;
		hmap.put(a, "小鬼");
		hmap.put(b, "大鬼");
		arr.add(a);
		arr.add(b);
		System.out.println("----------------创建牌局---------------");
		System.out.println(hmap);
		System.out.println(arr);

		// 洗牌
		System.out.println("----------------洗牌---------------");
		Collections.shuffle(arr);
		System.out.println(arr);

		// 看牌
		System.out.println("----------------看牌---------------");
		for (int i = 0; i < arr.size(); i++) {
			if (i >= arr.size() - 3) {
				dipai.add(hmap.get(arr.get(i)));
				// }else if(i % 3 == 0){
			} else if (i % 3 == 0) {
				one.add(hmap.get(arr.get(i)));
				// }else if(i % 2 == 0) {
				// 为什么能这么做?因为set是不能重复的,重复的被干掉了,然后剩下得正好不想关,但是最好别这么做,还是用下面这种的
			} else if (i % 3 == 1) {
				two.add(hmap.get(arr.get(i)));
			} else {
				three.add(hmap.get(arr.get(i)));// treeSet是按照字典顺序排列的,也可以将打乱后的索引放进去,再按照索引从hashmap里面拿牌
			}
		}
		System.out.println(one);
		System.out.println(two);
		System.out.println(three);
		System.out.println(dipai);
	}

}

输出:
----------------创建牌局---------------
{0=A红心, 1=2红心, 2=3红心, 3=4红心, 4=5红心, 5=6红心, 6=7红心, 7=8红心, 8=9红心, 9=10红心, 10=J红心, 11=Q红心, 12=K红心, 13=A方块, 14=2方块, 15=3方块, 16=4方块, 17=5方块, 18=6方块, 19=7方块, 20=8方块, 21=9方块, 22=10方块, 23=J方块, 24=Q方块, 25=K方块, 26=A黑桃, 27=2黑桃, 28=3黑桃, 29=4黑桃, 30=5黑桃, 31=6黑桃, 32=7黑桃, 33=8黑桃, 34=9黑桃, 35=10黑桃, 36=J黑桃, 37=Q黑桃, 38=K黑桃, 39=A梅花, 40=2梅花, 41=3梅花, 42=4梅花, 43=5梅花, 44=6梅花, 45=7梅花, 46=8梅花, 47=9梅花, 48=10梅花, 49=J梅花, 50=Q梅花, 51=K梅花, 52=小鬼, 53=大鬼}
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53]
----------------洗牌---------------
[40, 25, 30, 24, 41, 6, 47, 51, 50, 42, 4, 26, 19, 28, 33, 36, 5, 31, 8, 46, 10, 48, 22, 18, 23, 15, 12, 16, 20, 37, 14, 3, 45, 17, 7, 21, 2, 39, 53, 29, 13, 44, 43, 11, 49, 38, 9, 32, 35, 1, 27, 0, 34, 52]
----------------看牌---------------
[10梅花, 10黑桃, 2方块, 2梅花, 3红心, 4方块, 4梅花, 4黑桃, 5方块, 5梅花, 7方块, 9梅花, 9红心, J方块, J黑桃, K黑桃, Q方块]
[10方块, 10红心, 2红心, 3方块, 3梅花, 3黑桃, 4红心, 5红心, 6红心, 8方块, 8梅花, 8红心, A方块, A梅花, K方块, K梅花, Q红心]
[2黑桃, 5黑桃, 6方块, 6梅花, 6黑桃, 7梅花, 7红心, 7黑桃, 8黑桃, 9方块, A黑桃, J梅花, J红心, K红心, Q梅花, Q黑桃, 大鬼]
[9黑桃, A红心, 小鬼]

3、集合总结:

Collection:

  1. List(存取有序、有索引、可重复)
    【ArrayList(底层是数组;查找快,增删慢;线程不安全,效率高)重写子类equals方法
    【LinkList(底层是链表;查找慢,增删快;线程不安全,效率高)】
    【Vector(底层是数组;查找慢,增删慢;线程安全,效率低)】

  2. Set(存取无序、无索引、不可重复)
    【HashSet(底层是hash算法)重写子类hash算法和equalsTo()算法】【linkedHashSet(底层是链表,输入和输出顺序一样)】
    【TreeSet(底层是二叉树(0、+1、-1),输出有序)自然排序加选择器排序

  3. Map(双列集合,键值对)
    【HashMap(底层是hash算法)】【linkedHashMap(底层是链表,输入和输出顺序一样)】
    【TreeMap(底层是二叉树,输出有序)】

猜你喜欢

转载自blog.csdn.net/weixin_39782583/article/details/84850998