一.继承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;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.suit + this.point;
}
@Override
public 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>() {
@Override
public 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()));
}
}
}