Java 入门 37 Set系列集合的特点 集合工具类Collections 综合案例
package com.ITheima._set; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; public class SetDemo { public static void main(String[] args) { // 看看Set系列集合的特点: HashSet LinkedHashSet TreeSet // Set<String> sets=new HashSet<>();//一行经典代码 无序不重复 五索引 //Set<String> sets=new LinkedHashSet<>();//有序不重复 无索引 sets.add("HTML"); sets.add("MYSQL"); sets.add("Java"); sets.add("SpringBot"); System.out.println(sets);//[Java, MYSQL, HTML, SpringBot] } }
package com.ITheima._set; public class SetDemo1 { public static void main(String[] args) { // 目标:学会获取对象的哈希值,并确认一下 String name = "itheima"; System.out.println(name.hashCode());//2118746965 System.out.println(name.hashCode());//2118746965 String name1 = "itheima1"; System.out.println(name1.hashCode());//1256646524 System.out.println(name1.hashCode());//1256646524 } }
案例
Student类 重写 hasCode equals 方法
package com.ITheima._set; import java.util.Objects; public class Student { private String name; private int age; private char sex; public Student() { } public Student(String name, int age, char sex) { this.name = name; this.age = age; this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", sex=" + sex + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return age == student.age && sex == student.sex && Objects.equals(name, student.name); } @Override public int hashCode() { return Objects.hash(name, age, sex); } }
SetDemo3类
package com.ITheima._set; import java.util.HashSet; import java.util.Set; /** * 目标:让Set集合把重复内容的对象去掉一个(去重复) */ public class SetDemo3 { public static void main(String[] args) { // Set集合去重复原因:先判断哈希值算出来的存储位置是否相同 再判断equals Set<Student> sets = new HashSet<>(); Student s1 = new Student("无恙", 20, '男'); Student s2 = new Student("无恙", 20, '男'); Student s3 = new Student("周雄", 21, '男'); //必须重写 hasCode equals 两个方法(才能保证不会出现重复) System.out.println(s1.hashCode());//685325104 System.out.println(s2.hashCode());//460141958 System.out.println(s3.hashCode());//1163157884 sets.add(s1); sets.add(s2); sets.add(s3); System.out.println(sets); } }
LinkedHashSet
TreeSet 集合
Apple类
package com.itheima.d1_collection_set; public class Apple implements Comparable<Apple>{ private String name; private String color; private double price; private int weight; public Apple() { } public Apple(String name, String color, double price, int weight) { this.name = name; this.color = color; this.price = price; this.weight = weight; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getWeight() { return weight; } public void setWeight(int weight) { this.weight = weight; } @Override public String toString() { return "Apple{" + "name='" + name + '\'' + ", color='" + color + '\'' + ", price=" + price + ", weight=" + weight + '}'; } /** 方式一:类自定义比较规则 o1.compareTo(o2) * @param o * @return */ @Override public int compareTo(Apple o) { // 按照重量进行比较的 return this.weight - o.weight ; // 去重重量重复的元素 // return this.weight - o.weight >= 0 ? 1 : -1; // 保留重量重复的元素 } }
SetDemo5 类
package com.itheima.d1_collection_set; import java.util.Set; import java.util.TreeSet; /** 目标:观察TreeSet对于有值特性的数据如何排序。 学会对自定义类型的对象进行指定规则排序 */ public class SetDemo5 { public static void main(String[] args) { Set<Integer> sets = new TreeSet<>(); // 不重复 无索引 可排序 sets.add(23); sets.add(24); sets.add(12); sets.add(8); System.out.println(sets); Set<String> sets1 = new TreeSet<>(); // 不重复 无索引 可排序 sets1.add("Java"); sets1.add("Java"); sets1.add("angela"); sets1.add("黑马"); sets1.add("Java"); sets1.add("About"); sets1.add("Python"); sets1.add("UI"); sets1.add("UI"); System.out.println(sets1); System.out.println("------------------------------"); // 方式二:集合自带比较器对象进行规则定制 // // Set<Apple> apples = new TreeSet<>(new Comparator<Apple>() { // @Override // public int compare(Apple o1, Apple o2) { // // return o1.getWeight() - o2.getWeight(); // 升序 // // return o2.getWeight() - o1.getWeight(); // 降序 // // 注意:浮点型建议直接使用Double.compare进行比较 // // return Double.compare(o1.getPrice() , o2.getPrice()); // 升序 // return Double.compare(o2.getPrice() , o1.getPrice()); // 降序 // } // }); Set<Apple> apples = new TreeSet<>(( o1, o2) -> Double.compare(o2.getPrice() , o1.getPrice()) ); apples.add(new Apple("红富士", "红色", 9.9, 500)); apples.add(new Apple("青苹果", "绿色", 15.9, 300)); apples.add(new Apple("绿苹果", "青色", 29.9, 400)); apples.add(new Apple("黄苹果", "黄色", 9.8, 500)); System.out.println(apples); } }
可变参数
package com.itheima.d2_params; import java.util.Arrays; /** 目标:可变参数。 可变参数用在形参中可以接收多个数据。 可变参数的格式:数据类型...参数名称 可变参数的作用: 传输参数非常灵活,方便。 可以不传输参数。 可以传输一个参数。 可以传输多个参数。 可以传输一个数组。 可变参数在方法内部本质上就是一个数组。 可变参数的注意事项: 1.一个形参列表中可变参数只能有一个!! 2.可变参数必须放在形参列表的最后面!! 小结: 记住。 */ public class MethodDemo { public static void main(String[] args) { sum(); // 1、不传参数 sum(10); // 2、可以传输一个参数 sum(10, 20, 30); // 3、可以传输多个参数 sum(new int[]{10, 20, 30, 40, 50}); // 4、可以传输一个数组 } /** 注意:一个形参列表中只能有一个可变参数,可变参数必须放在形参列表的最后面 * @param nums */ public static void sum( int...nums){ // 注意:可变参数在方法内部其实就是一个数组。 nums System.out.println("元素个数:" + nums.length); System.out.println("元素内容:" + Arrays.toString(nums)); } }
Collection集合工具类
package com.itheima.d3_collections; import java.util.*; /** 目标:Collections工具类的使用。 java.utils.Collections:是集合工具类 Collections并不属于集合,是用来操作集合的工具类。 Collections有几个常用的API: - public static <T> boolean addAll(Collection<? super T> c, T... elements) 给集合对象批量添加元素! - public static void shuffle(List<?> list) :打乱集合顺序。 - public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。 - public static <T> void sort(List<T> list,Comparator<? super T> c):将集合中元素按照指定规则排序。 */ public class CollectionsDemo01 { public static void main(String[] args) { List<String> names = new ArrayList<>(); //names.add("楚留香"); //names.add("胡铁花"); //names.add("张无忌"); //names.add("陆小凤"); Collections.addAll(names, "楚留香","胡铁花", "张无忌","陆小凤"); System.out.println(names); // 2、public static void shuffle(List<?> list) :打乱集合顺序。 Collections.shuffle(names); System.out.println(names); // 3、 public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。 (排值特性的元素) List<Integer> list = new ArrayList<>(); Collections.addAll(list, 12, 23, 2, 4); System.out.println(list); Collections.sort(list); System.out.println(list); } }
Sort 排序
package com.itheima.d3_collections; import java.util.*; /** 目标:引用数据类型的排序。 字符串按照首字符的编号升序排序! 自定义类型的比较方法API:Collections - public static <T> void sort(List<T> list): 将集合中元素按照默认规则排序。 对于自定义的引用类型的排序人家根本不知道怎么排,直接报错! - public static <T> void sort(List<T> list,Comparator<? super T> c): 将集合中元素按照指定规则排序,自带比较器 */ public class CollectionsDemo02 { public static void main(String[] args) { List<Apple> apples = new ArrayList<>(); // 可以重复! apples.add(new Apple("红富士", "红色", 9.9, 500)); apples.add(new Apple("青苹果", "绿色", 15.9, 300)); apples.add(new Apple("绿苹果", "青色", 29.9, 400)); apples.add(new Apple("黄苹果", "黄色", 9.8, 500)); // Collections.sort(apples); // 方法一:可以的,Apple类已经重写了比较规则 // System.out.println(apples); // 方式二:sort方法自带比较器对象 // Collections.sort(apples, new Comparator<Apple>() { // @Override // public int compare(Apple o1, Apple o2) { // return Double.compare(o1.getPrice() , o2.getPrice()); // 按照价格排序!! // } // }); Collections.sort(apples, ( o1, o2) -> Double.compare(o1.getPrice() , o2.getPrice()) ); System.out.println(apples); } }
斗地主案例
Cards类
package com.ITheima.CardTest; public class Card { private String size; private String color; private int index;//第几张牌 public Card() { } public Card(String size, String color, int index) { this.size = size; this.color = color; this.index = index; } public String getSize() { return size; } public void setSize(String size) { this.size = size; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } @Override public String toString() { return size+color; } }
GameDemo 测试类
package com.ITheima.CardTest; import java.sql.SQLOutput; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class GaveDemo { //1 定义一个静态集合存储54张牌 public static List<Card> allCards=new ArrayList<>(); /** * * 2 做牌: 定义静态代码块初始化牌数据 */ static { //3 定义点数: 个数确定 类型确定,使用数组 String [] sizes= {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; // 4、定义花色:个数确定,类型确定,使用数组 String[] colors = {"♠", "♥", "♣", "♦"}; //5 组合点数和花色 int index=0;//记录牌的大小 for (String size : sizes) { index++; for (String color : colors) { //6 风转成一个牌对象 Card c=new Card(size,color,index); //7 存入到集合容器中去 allCards.add(c); } } // 8 大小王存入到集合对象中去 "👲" , "🃏" Card c1 = new Card("" , "🃏", ++index); Card c2 = new Card("" , "👲",++index); Collections.addAll(allCards,c1,c2); System.out.println("新牌"+allCards); } public static void main(String[] args) { //9 洗牌 Collections.shuffle(allCards); System.out.println("洗牌后:" + allCards); // 10、发牌(定义三个玩家,每个玩家的牌也是一个集合容器) List<Card> linhuchong = new ArrayList<>(); List<Card> jiumozhi = new ArrayList<>(); List<Card> renyingying = new ArrayList<>(); // 11、开始发牌(从牌集合中发出51张牌给三个玩家,剩余3张作为底牌) // allCards = [🃏, A♠, 5♥, 2♠, 2♣, Q♣, 👲, Q♠ ... // i 0 1 2 3 4 5 6 7 % 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); } } // 12、拿到最后三张底牌(把最后三张牌截取成一个子集合) List<Card> lastThreeCards = allCards.subList(allCards.size() - 3 , allCards.size()); // 13、给玩家的牌排序(从大到小 可以自己先试试怎么实现) sortCards(linhuchong); sortCards(jiumozhi); sortCards(renyingying); // 14、输出玩家的牌: System.out.println("啊冲:" + linhuchong); System.out.println("啊鸠:" + jiumozhi); System.out.println("盈盈:" + renyingying); System.out.println("三张底牌:" + lastThreeCards); } /** * 给牌排序 */ private static void sortCards(List<Card> cards){ Collections.sort(cards, new Comparator<Card>() { @Override public int compare(Card o1, Card o2) { // o1 = J♥ // o2 = A♦ // 知道牌的大小,才可以指定规则 return o2.getIndex() - o1.getIndex(); } }); } }