Day19-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\CollectionandMap-LinkedHashSet+TreeSet+Collections方法+斗地主
LinkedHashSet
基于哈希表(数组、链表、红黑树)
但是,它的每个元素都额外多了一个双链表的记录机制就它前后元素的位置。
但是占用内存较大
TreeSet
特点:不重复、无索引、可排序
底层是基于红黑树实现的排序
注意
对于数值类型:Interger,Double,默认按照数值本身的大小进行排序
对于字符串类型,默认按照首字母的编号升序排序
对于自定义类型如Student对象,TreeSet默认是无法直接排序的
原因,TreeSet不知道自定义类的排序方式,年龄?身高?那就报错了
自定义排序规则
-
让自定义类实现Comparable接口,重写里面的compareTo方法来指定比较规则
-
通过调用TreeSet集合有参构造器,可以设置Comparator对象(比较强对象),用于指定比较规则
集合的并发修改异常
使用迭代器遍历集合时,又同时在删除集合中的数据,程序就会出现并非修改异常的错误
package com.CollectionandMap.collection_exception;
import java.sql.Array;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class CollectionTest1 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("王麻子");
list.add("小李子");
list.add("李爱花");
list.add("张全蛋");
list.add("晓李");
list.add("李玉刚");
System.out.println(list);//[王麻子, 小李子, 李爱花, 张全蛋, 晓李, 李玉刚]
//需求:找出集合中全部带“李”的名字,并从集合中删除
// Iterator<String> it = list.iterator();
// while (it.hasNext()) {
// String name = it.next();
// if (name.contains("李")){
// list.remove(name);
// }
// }
// System.out.println(list);
//使用for循环遍历集合并删除中带李字的名字
//[王麻子, 小李子, 李爱花, 张全蛋, 晓李, 李玉刚]
//[王麻子, 李爱花, 张全蛋, 晓李, 李玉刚]
// I
// for(int i=0;i<list.size();i++){
// String name = list.get(i);
// if (name.contains("李")){
// list.remove(name);
// }
// }
// System.out.println(list);
//[王麻子, 李爱花, 张全蛋, 李玉刚]
// System.out.println("=========================");
// for(int i=0;i<list.size();i++){
// String name = list.get(i);
// if (name.contains("李")){
// list.remove(name);//并发修改异常的错误
// i--;//关键步骤
// }
// }
// System.out.println(list);
//[王麻子, 张全蛋]
System.out.println("=========================");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String name = it.next();
if (name.contains("李")){
//list.remove(name);//并发修改异常的错误
//i--;//关键步骤
it.remove();//删除迭代器遍历到的数据,每删除一个数据后,相当于也在底层做了一次i--
}
}
System.out.println(list);
// list.forEach(System.out::println);
// for (String name : list) {//本质上也是迭代器,但是没有迭代器的实例化对象,拿不到迭代器
// // list.iterator() 方法返回的迭代器实例就是被实例化的对象,它是 Iterator 接口的某个具体实现类的对象。
// if(name.contains("李")){
// list.remove(name);//增强for遍历修改无法解决ConcurrentModificationException的bug
// }
// }
// System.out.println(list);
// list.forEach(name->{//源代码里面调用增强for,实际上还是
// if (name.contains("李")){
// list.remove(name);
// }
// });
// System.out.println(list);
}
}
Collections
是一个用来操作集合的工具类
Collections提供的常用静态方法
斗地主(Card+Room+GameDemo)
Card
package com.CollectionandMap;
public class Card {
private String number;
private String color;
private int size;
public Card() {
}
public Card(String number, String color, int size) {
this.number = number;
this.color = color;
this.size = size;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
@Override
public String toString() {
return color + number ;
}
}
Room
package com.CollectionandMap;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Room {
//必须要有一副牌
private List<Card> allCards = new ArrayList<Card>();
public Room() {//无参构造器
//1、做出54张牌,存入到集合allCards
//a、点数:个数确定了,类型确定
String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A","2"};
//b、花色:个数确定、类型确定
String[] colors = {"♠️","♥️","⬛️","♣️"};
int size = 0;//用他来表示每张牌的大小
//c、遍历点数,内部再遍历花色
for (String number : numbers) {
//number = "3"
size++;//1,2,3...
for (String color : colors) {
//得到一张牌
Card c = new Card(number,color,size);
allCards.add(c);//存入了牌
//到这里存入了52张牌
}
}
//单独存入大小王
Card c1 = new Card("","🃏",++size);
Card c2 = new Card("","👨",++size);
Collections.addAll(allCards,c1,c2);
System.out.println("这是一副新牌"+allCards);
}
public void start(){
//1、洗牌
Collections.shuffle(allCards);
System.out.println("洗牌后"+allCards);
//2、发牌,首先肯定要定义三个玩家,List(ArrayList)、Set(TreeSet),满足可以重复
List<Card> linHuChong = new ArrayList<>();
List<Card> jiuMoZhi = new ArrayList<>();
List<Card> renYingYing = new ArrayList<>();
//3、正式发牌给三个玩家
//[♣️7, ♠️6, ♥️10, ♠️9, ♣️J, ♣️2, ...
// 0 1 2 3
for(int i=0;i<allCards.size() - 3;i++){
Card c = allCards.get(i);
if (i%3==0){
linHuChong.add(c);
}else if (i%3==1){
jiuMoZhi.add(c);
}else if (i%3==2){
renYingYing.add(c);
}
}
//3、对三个玩家的牌进行排序
sortCards(linHuChong);
sortCards(jiuMoZhi);
sortCards(renYingYing);
//4、看牌
System.out.println("啊冲:"+linHuChong);
System.out.println("啊鸠:"+jiuMoZhi);
System.out.println("啊莹:"+renYingYing);
List<Card> lastThreeCards =allCards.subList(allCards.size()-3, allCards.size());
jiuMoZhi.addAll(lastThreeCards);
System.out.println("啊鸠抢到地主后:"+ jiuMoZhi);
}
/**
* 集中进行排序
* @param cards
*/
private void sortCards(List<Card> cards){
Collections.sort(cards,new Comparator<Card>() {
@Override
public int compare(Card o1, Card o2) {//基于红黑树的compare本质上是比较哈希值大小
return o1.getSize() - o2.getSize();//升序排列
// 若 compare(a, b) < 0(a < b):a 会被视为 “小于”b,在红黑树中,a 可能会被放在 b 的左子树中。
// 若 compare(a, b) > 0(a > b):a 会被视为 “大于”b,在红黑树中,a 可能会被放在 b 的右子树中。
// 若 compare(a, b) == 0(a == b):a 和 b 被视为 “相等”,在红黑树中通常不会重复插入(或按特定规则处理,如覆盖)。
}
});
}
}
GameDemo
package com.CollectionandMap;
/*
* 目标:斗地主游戏的案例开发
* 业务需求分析
* 业务:总数有54张牌
* 点数:“3”,“4”...“10”,“J”,“Q”,“K”,“A”,“2”
* 花色:
* 大小王
* 点数分别要组合四种花色,大小王各一张
* 斗地主:发出51张牌,剩下3张作为底牌
* */
public class GameDemo {
public static void main(String[] args) {
//1、牌类
//2、房间
Room m = new Room();
//3、启动游戏
m.start();
}
}

浙公网安备 33010602011771号