一.继承Comparable实现排序

下面以扑克牌为例:

首先创建扑克实体类继承Comparable<Poker>接口:

public class Poker implements Comparable<Poker>{private String suit;private String point;public Poker(String suit, String point) {super();this.suit = suit;this.point = point;}public String getSuit() {return suit;}public void setSuit(String suit) {this.suit = suit;}public String getPoint() {return point;}public void setPoint(String point) {this.point = point;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn this.suit + this.point;}@Overridepublic int compareTo(Poker o) {//定义排序规则//将玩家手中的牌按照点数排序if (getIndex(this.point) >= getIndex(o.point)) {return 1;//compareTo返回正数,新添加的元素一定往后放}else {return -1;}//3 4 5 6 7 8 9 10 J Q K A 2 小王 大王//1 2 3 4 .................13 14 15//点数相同的,按照抓牌顺序排列}//将 J Q K A 2 小王 大王 重新编序号public int getIndex(String point) {if (point.equals("J")) {return 9;}else if (point.equals("Q")) {return 10;}else if (point.equals("K")) {return 11;}else if (point.equals("A")) {return 12;}else if (point.equals("2")) {return 13;}else if (point.equals("小王")) {return 14;}else if (point.equals("大王")) {return 15;}else {return Integer.parseInt(point) - 2;}}}

main方法测试:

/** 使用集合实现三人斗地主  【写不完明天写,昨天的登录注册没写完的今天必须写完】每人17张 三张底牌 要求:要求集合中存储的为扑克牌对象(如:new Poker(“红桃”,”2”),new Poker(“梅花”,”A”))发牌方法尽可能多的洗牌方法查看各个玩家牌面的方法每个玩家的牌面按照点数进行排序(明天学)* */
public class Demo1 {static ArrayList<Poker> pokers = new ArrayList<Poker>();static TreeSet<Poker> player1 = new TreeSet<Poker>();static TreeSet<Poker> player2 = new TreeSet<Poker>();static TreeSet<Poker> player3 = new TreeSet<Poker>();static ArrayList<Poker> dipai = new ArrayList<Poker>();public static void main(String[] args) {//创建扑克牌集合createPokers();//查看当前牌面showPokers(pokers);//洗牌shufflePokers();//查看当前牌面showPokers(pokers);//发牌sendPokers();//查看玩家牌面System.out.println("玩家1的牌面");showPokers(player1);System.out.println("玩家2的牌面");showPokers(player2);System.out.println("玩家3的牌面");showPokers(player3);System.out.println("底牌");showPokers(dipai);}private static void sendPokers() {// 一人一张抓拍,最后三张为底牌for (int i = 0; i < pokers.size() - 3; i++) {if (i % 3 == 0) {player1.add(pokers.get(i));player2.add(pokers.get(i+1));player3.add(pokers.get(i+2));}}dipai.add(pokers.get(51));dipai.add(pokers.get(52));dipai.add(pokers.get(53));}private static void shufflePokers() {//洗牌  取出每一张牌,跟随机位置的牌交换for (int i = 0; i < pokers.size(); i++) {//pokers.get(i)//获取随机位置   pokers.get(randomIndex)int randomIndex = new Random().nextInt(pokers.size());Poker temp = pokers.get(i);pokers.set(i, pokers.get(randomIndex));pokers.set(randomIndex, temp);}}public static void createPokers() {//创建集合存储点数ArrayList<String> suits = new ArrayList<String>();suits.add("红桃");suits.add("黑桃");suits.add("梅花");suits.add("方块");ArrayList<String> points = new ArrayList<String>();points.add("A");for (int i = 2; i <= 10; i++) {points.add(i + "");}points.add("J");points.add("Q");points.add("K");//往扑克牌集合中添加对象for (int i = 0; i < suits.size(); i++) {for (int j = 0; j < points.size(); j++) {//花色:suits.get(i)  点数points.get(j)//构建poker牌对象Poker poker = new Poker(suits.get(i), points.get(j));//将扑克牌对象添加到集合中pokers.add(poker);}}pokers.add(new Poker("", "大王"));pokers.add(new Poker("", "小王"));}public static void showPokers(Collection<Poker> c) {//遍历扑克牌数组for (Poker poker : c) {System.out.print(poker + " ");}System.out.println();}}

二.使用匿名Comparator类实现排序

学生成绩排序为例:

public class Demo2 {public static void main(String[] args) {TreeSet<Student> set = new TreeSet<>(new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {//要求:按总分进行排序,总分相同按照数学排,数学也相同,按照语文,语文也相同,按照名字排序Double score1 = o1.getChinese() + o1.getMath() + o1.getEnglish();Double score2 = o2.getChinese() + o2.getMath() + o2.getEnglish();//总分不相等的按照总分排序(升序)if (score1 != score2) {//return (int)(score1 - score2);//转化之后85.5和85.4总分相同return score1.compareTo(score2);}//总分相同的按照数学排序   数学不相等的按照数学排序if(o1.getMath() != o2.getMath()) {return Double.valueOf(o1.getMath()).compareTo(Double.valueOf(o2.getMath()));}if (o1.getChinese() != o2.getChinese()) {return Double.valueOf(o1.getChinese()).compareTo(Double.valueOf(o2.getChinese()));}return o1.getName().compareTo(o2.getName());}});set.add(new Student("lily", 100, 80, 90));set.add(new Student("frank", 80, 80, 80));set.add(new Student("amy", 60, 100, 90));//遍历集合System.out.println("姓名\t语文\t数学\t外语\t总分");//总分保留两位有效数字for (Student s : set) {System.out.println(s.getName() + "\t" + s.getChinese()+ "\t" + s.getMath()+ "\t" + s.getEnglish()+"\t" + (s.getChinese() + s.getMath() + s.getEnglish()));}}}

扑克牌自定义排序,使用集合TreeSet实现实体对象排序,通过实现Comparable接口,重写compareTo比较器;相关推荐

  1. 实体对象集合中根据实体对象的某一属性进行大小排序

    背景 代码实现 思路简述 效果图示 背景 今天我的领导跟我提了一个小小的建议,我觉得很不错.我有这么一个界面,显示的是小车的电量信息,界面很简单,简单的由listView控件展示数据.界面的小车电量信 ...

  2. Collections.sort()泛型集合排序的使用,和自定义类实现Comparable<T>接口重写compareTo(T o)方法完成Collections.sort()排序,以及自定义排序规则

    Collections算法类         1.Collections类是Java提供的一个集合操作工具类. 2.Collections类定义了一系列用于操作集合的静态方法,用于实现对集合元素的排序 ...

  3. java list对象排序_Java 对象集合List排序的5种方式

    目标明确 排序对象类 public class Student{ private String name; private Integer age; public Student(String nam ...

  4. Android-Java 排序TreeSet 自然排序+对象排序+中文排序

    一.这里主要讲解的是对象排序(按某个属性或某种规则) 首先要明白,TreeSet为什么能实现自然排序?是怎么实现的?它怎么知道谁该排在前面,谁该排在后面?引用类型排序有什么样的要求? 这里我就直接一点 ...

  5. java comparable排序_java 实现Comparable接口排序,升序、降序、倒叙

    本人由于项目开发中需要对查询结果list进行排序,这里根据的是每一个对象中的创建时间降序排序.本人讲解不深,只实现目的,如需理解原理还需查阅更深的资料. 1.实现的效果 2.创建排序的对象 packa ...

  6. java comparable接口_Java面试题之Java集合篇三

    Java面试题之Java集合篇三1.HashMap和HashTable有何不同? (1)HashMap允许key和value为null,而HashTable不允许. (2)HashTable是同步的, ...

  7. Java 对象排序完整版

    前几天在 LeetCode 刷题的时候,遇到了利用 Arrays.sort() 或 Collections.sort() 来对 Java 对象进行排序的需求,于是想较详细地总结一下 Java 对象的排 ...

  8. java comparable排序_JAVA中通过Comparable接口实现简单排序

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f, ...

  9. java map对象排序输出_java实现对象的排序(List和Map)

    java实现对象的排序(List和Map) List和Map的排序 在实际的开发当中,我们经常 在文件浏览的时候经常有多种浏览方式,按时间整箱排序,逆向排序,按大小正逆向排序 ,按 按价格正逆向排序, ...

最新文章

  1. SAP Return to External Vendor
  2. 机器视觉与机器学习牛人博客
  3. Lambda 表达式的应用
  4. mysql long varchar2_long查询结果转换为varchar2类型
  5. ActiveMQ入门-发送消息机制的介绍
  6. Windows 11 小技巧- WSL开启Linux桌面应用
  7. 【刷题】BZOJ 4195 [Noi2015]程序自动分析
  8. 从行业应用到智慧城市,升哲科技Alpha协议如何保障物理世界的数据传输
  9. emacs 替换模式_如何使用Emacs Org模式撰写博客
  10. MySQL工作中的实际用_总结工作中经常用到的mysql基础知识
  11. 交换机中对于tagged帧和untagged帧的处理
  12. VB Label自动换行妙招
  13. RI-TRP-DR2B 32mm 玻璃应答器|CID载码体标签在半导体行业重复利用之检测方法
  14. java之Mybatis(实训笔记)
  15. TC297 Memory Maps 内存映射
  16. 空间两条直线段的最短距离及最近点计算
  17. linux删除文件夹或者文件
  18. (16)业务数据导入HDFS
  19. RePr Improved Training of Convolutional Filters阅读翻译
  20. 运维同学,你们公司的运维团队有多少人?

热门文章

  1. Oracle数据库重复数据删除的三种情况
  2. 强大的DataGrid组件[12]_分组(Group)——Silverlight学习笔记[20]
  3. 最近一到在混“智器粉丝团”,好久没写blog了~
  4. Java 非小数BigDecimal转换为Integer
  5. 20181027 考试记录
  6. mysql数据库死锁的产生原因及解决办法
  7. 搭建nuxtjs程序 —— 用户信息 or token怎么不丢失
  8. kafka(一)设计分析
  9. JsonHelper(Json帮助类)
  10. VB6.0动态加载ActiveX控件漫谈[转]