上次写了一篇52张扑克牌的算法,写的将一副扑克(去掉大小王)之后的排序,排序是按照数字和花式排列的。数字从大到小,花式从黑桃,梅花,红心,方块。后来有一个网友回复,还希望看到13张扑克牌的排序算法——这个算法是按照我们打牌的常规排法,把数量多的放前面,数量相同的比大小。可以参考文章的输出结果看。

完整代码如下:

class PokerSorterDemo { static string[] numberArray = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" }; static char[] suitArray = { '♠', '♣', '♥', '♦' }; class Poker { public Poker() { this.Suits = new List<char>(); } public List<char> Suits { get; set; } public int Number { get; set; } public override string ToString() { StringBuilder sb = new StringBuilder(); foreach (char c in suitArray) { if (this.Suits.Contains(c)) { sb.AppendLine(string.Format("{0}{1}", c, numberArray[this.Number - 2])); // 这个地方的2只是为了调试时,方便阅读 } } return sb.ToString(); } } class PokerList : List<Poker> { public void Add(string poker) { string num = poker.Substring(1); int number = numberArray.ToList().IndexOf(num) + 2; // 这个地方的2,只是为了调试方便 if (this.Any(p => p.Number == number)) { Poker find = this.Find(p => p.Number == number); find.Suits.Add(poker[0]); } else { Poker p = new Poker { Number = number }; p.Suits.Add(poker[0]); this.Add(p); } } } private static void Main() { GenerateRandPoker3(); PokerSorter2(); } private static void PokerSorter2() { PokerList list = new PokerList(); using (StreamReader file = new StreamReader("Poker.txt", Encoding.UTF8)) { string line; while ((line = file.ReadLine()) != null) { if (line.Trim().Length > 0) { list.Add(line.Trim()); } } file.Close(); } var result = from p in list orderby p.Suits.Count descending, p.Number descending select p; using (StreamWriter file = new StreamWriter("SortedPoker.txt", false, Encoding.UTF8)) { foreach (Poker item in result) { file.Write(item.ToString()); } file.Close(); } } private static void GenerateRandPoker3() { List<string> list = new List<string>(); for (int i = 0; i < numberArray.Length; i++) { for (int j = 0; j < suitArray.Length; j++) { list.Add(string.Format("{0}{1}", suitArray[j], numberArray[i])); } } using (StreamWriter file = new StreamWriter("Poker.txt", false, Encoding.UTF8)) { Random r = new Random(); while (list.Count > 39) { int i = r.Next(0, list.Count - 1); file.WriteLine(list[i]); list.RemoveAt(i); } file.Close(); } } }

先定义了一个Poker的类,来标记一副牌中所包含的同数字的所有牌,例如13张牌中有4个A,那么一个Poker都代表这4个A,用Number,代表牌代表的数字,在上面的代码中,Number代表了扑克牌,在numberArray中的索引。Suits,代表了Poker都包含的花式有几个,对于一副牌,最多有4个。如果两副牌最多有8个。关键的排序算法,在上述代码中用到了LINQ。当然,不用LING也是可以的,可以用以下代码代替。

private static int ComparePoker(Poker p1, Poker p2) { Debug.Assert(p1 != null && p2 != null); if (p1.Suits.Count == p2.Suits.Count) { return p2.Number - p1.Number; } else { return p2.Suits.Count - p1.Suits.Count; } }

然后在调用的地方修改为:

//var result = from p in list // orderby p.Suits.Count descending, p.Number descending // select p; list.Sort(ComparePoker); using (StreamWriter file = new StreamWriter("SortedPoker.txt", false, Encoding.UTF8)) { //foreach (Poker item in result) foreach (Poker item in list) { file.Write(item.ToString()); } file.Close(); }

程序允许的结果如下,Poker.txt

♥4 ♣10 ♦K ♠4 ♥7 ♦6 ♥A ♦4 ♠6 ♣9 ♦8 ♣3 ♠5

SortedPoker.txt

♠4 ♥4 ♦4 ♠6 ♦6 ♥A ♦K ♣10 ♣9 ♦8 ♥7 ♠5 ♣3

13张扑克牌排序算法相关推荐

  1. 52张扑克牌排序算法

    算法要求: 生成一副扑克牌,并打乱顺序 对乱序的扑克牌文件进行排序 为了方便阅读,我们直接将扑克牌生成为人工可以识别的字符串,数字从2,3,4,5,6,7,8,9,10,J,Q,K,A,花式为♠,♣, ...

  2. 有13张扑克牌,怎样确定牌中有没有顺子(顺子:连续的5张牌)

    有13张扑克牌,怎样确定牌中有没有顺子(顺子:连续的5张牌) 分析思路如下: 1.可能出现的牌为数字(2-10).(J-K,A,大小王),先将不能直接作为数字排列的牌替换成数字: 2.将整个数组转换为 ...

  3. java 54张扑克牌_算法练习篇之:扑克牌顺子

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 代码实现 import java.util.Arrays; public class isContinuous { //扑克牌顺子(必须连续的五个数字) ...

  4. [Alg]排序算法之分布排序

    [Alg]排序算法之分布排序 作者:屎壳郎 日期:Aug 2021 版次:初版 简介: 分布排序是与归并排序截然相反的处理思路,归并排序是逐步融合归并,而分布排序是分组然后合并,再分组再合并,所以分布 ...

  5. 扑克牌移动 下面代码模拟了一套扑克牌(初始排序A~K,共13张)的操作过程。

    /*下面代码模拟了一套扑克牌(初始排序A~K,共13张)的操作过程.操作过程是:手里拿着这套扑克牌,从前面拿一张放在后面,再从前面拿一张放桌子上,再从前面拿一张放在后面,....如此循环操作,直到剩下 ...

  6. 蓝桥杯真题 15省7-牌型种数 小明被劫持到X赌城,被迫与其他3人玩牌。 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。 这时,小明脑子里突然冒出一个问题: 如果不考虑花色,

    题目描述 小明被劫持到X赌城,被迫与其他3人玩牌. 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张. 这时,小明脑子里突然冒出一个问题: 如果不考虑花色,只考虑点数,也不考虑自己得 ...

  7. 10大经典排序算法,20+张图就搞定

    作者 | 李肖遥 来源 | 技术让梦想更伟大 冒泡排序 简介 冒泡排序是因为越小的元素会经由交换以升序或降序的方式慢慢浮到数列的顶端,就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名冒泡排序. ...

  8. 「八大排序算法」16张图带你搞懂基数排序

    前言 在排序算法中,大家可能对桶排序.计数排序.基数排序不太了解,不太清楚其算法的思想和流程,也可能看过会过但是很快就忘记了,但是不要紧,幸运的是你看到了本篇文章.本文将通俗易懂的给你讲解基数排序. ...

  9. c++ 不插入重复元素但也不排序_面试官爱问的 10 大经典排序算法,20+ 张图来搞定...

    (给算法爱好者加星标,修炼编程内功) 作者:技术让梦想更伟大 / 李肖遥 (本文来自作者投稿) 冒泡排序 简介 冒泡排序是因为越小的元素会经由交换以升序或降序的方式慢慢浮到数列的顶端,就如同碳酸饮料中 ...

最新文章

  1. JDK 竟然是这样实现栈的?
  2. U-Boot的LDS文件分析
  3. 【Linux网络编程】IP地址介绍
  4. cookie自动登陆
  5. (Ⅰ)基于Hexo+GitHub Page搭建博客,绑定域名及备份
  6. 蓝桥杯 2011年第二届C语言初赛试题(2)
  7. 128位java_Java:如何使用CFB和无填充实现128位AES
  8. Mac系统中桌面图片和用户头像图片的路径
  9. 使用类名称创建实例并调用构造函数
  10. python单例模式和装饰器
  11. VS通过opencv显示图片和打开相机的显示生成dll用unity调用
  12. java 开发常用工具下载
  13. vs2019 无法打开包括文件:“SDKDDKVer.h”: No such file or directory的另外一种解决思路
  14. Mac 显示/不显示隐藏文件
  15. Java 模拟鼠标、键盘--向可编辑窗口录入内容
  16. 学信网学位认证报告在哪
  17. win7识别到移动硬盘,但不显示盘符解决办法
  18. thymeleaf内嵌变量
  19. 一台服务器支持多个域名和站点
  20. 知乎 985高校工程博士值得读么

热门文章

  1. 医院在线预约挂号管理系统(Java+SSH+MySQL)
  2. Linux二进制exploit入门
  3. Final发布 文案+美工展示
  4. 使用java计算数组方差和标准差
  5. 第一章 c语言概述程序逻辑,第一章 程序逻辑与C语言概述
  6. 递归函数将一个正整数的各位由高到低依次输出
  7. 2021软科大学排名爬虫程序
  8. 元宇宙技术在几年后质变,迎来体验终端世界
  9. 【知识点总结】【CSP考前复习】图论大杂烩【未完】
  10. 时间序列-异常检测(Anomaly Detection)(二):传统方法