最近看到javaEye 上有一位仁兄帖出来取扑克牌乱序算法。看过还是有问题,都没有人想到而纠正过来,本想直接回复的,可以已经结帖了。
我又最近比较空,所以自己博客里也写写,算是给一些新手和老手一点新的算法思路。
package com.swing; import java.util.Enumeration; import java.util.Hashtable; /** * 乱序扑克牌 洗牌方法 * * @author virture * */ public class Cards { Hashtable htMember = new Hashtable();// 放置扑克牌的Hash表 public Cards() { } public void put(String card) { htMember.put(card, card); } public void get() { System.out.println("你拿到的牌是:"); Enumeration RLKey = htMember.keys(); while (RLKey.hasMoreElements()) { String accKey = RLKey.nextElement().toString();// 取HashTable中的关键字词 System.out.print((String) htMember.get(accKey) + ","); } } public static void main(String[] args) { String[] cards = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" }; String[] kinds = { "黑桃", "红桃", "梅花", "方块" }; Cards cardList = new Cards(); String suit;// 当前选中牌的类型 String face;// 当前选中牌 int randomCardNum = 52;// 当前随机取牌的个数,记住不能大于全部牌52张 while (true) { suit = kinds[Math.round((float) Math.random() * (kinds.length - 1))]; face = cards[Math.round((float) Math.random() * (cards.length - 1))]; cardList.put(suit + face); if (cardList.htMember.size() >= randomCardNum && cardList.htMember.size() <= 52) { break; } } cardList.get(); } }
这里也同样适用于其它过滤重复字段的方法。直接用HashTable来存储重复字段。重复的最多再覆盖一下,而不必用 for 循环判断 n*n次。对于大量的数据的排重是有显著的提升的。
其它的乱序取扑克牌有一个通病,可能会取重复的现象。大家要注意啊。