JAVA学习笔记42——TreeSet、TreeMap应用+collections模拟斗地主洗牌

来源:互联网 发布:软件系统管理员手册 编辑:程序博客网 时间:2024/06/07 03:57

最近在看JAVA教学的视频,觉得老师讲的很好,同时借用源代码还有笔记来撰写本系列博客,记录自己的学习内容,同时也供看到的人学习。

本篇的第一个内容是结合笔记40所讲的内容介绍一下TreeSet:

TreeSet:数据容器可以排序且不可重复,它是set接口的另一个实现类;对比而言的HashSet,元素必须重写hashcode、equals方法,而它不用。


下面是总结性的知识:


下面是四段实际应用代码,一个是TreeSet结合comparable成为实体比较类进行排序,一个是TreeSet借用comparator比较器成为排序业务类,一个是TreeMap结合comparable成为实体比较类进行排序,一个是TreeMap借用comparator比较器成为排序业务类。

首先放上的是公用的信息类,Person类和Worker类,其中worker类从代码可以看出是实现了comparable接口,加入(重写)了compara方法,为了实现其中一种比较方法:

import java.util.ArrayList;import java.util.Collections;import java.util.List;public class Person {//加上final是为了防止数据被随意修改,防止发生重复,同时去掉了所有的set方法private final String name;//名称private final int handsome;//帅气指数public Person() {name =null;handsome =0;}public Person(String name, int handsome) {super();this.name = name;this.handsome = handsome;}public String getName() {return name;}public int getHandsome() {return handsome;}@Overridepublic String toString() {return "姓名:"+this.name+",帅气指数:"+this.handsome+"\n";}}
//采用的是实体类实现comparable接口来进行排序public class Worker implements java.lang.Comparable<Worker> {//工种private String type;//工资private double salary;public Worker() {// TODO Auto-generated constructor stub}public Worker(String type, double salary) {super();this.type = type;this.salary = salary;}public String getType() {return type;}public void setType(String type) {this.type = type;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}/** * 按工资升序 */@Overridepublic int compareTo(Worker o) {return this.salary>o.salary?1:( this.salary==o.salary?0:-1);}@Overridepublic String toString() {return "工种:"+this.type+",工资:"+this.salary+"\n";}}
NO.1:TreeSet结合comparable成为实体比较类进行排序

import java.util.TreeSet;/** * 实体类实现Comparable 接口的应用 * @author Administrator * */public class TreeSetDemo2 {public static void main(String[] args) {Worker w1 =new Worker("垃圾回收员",12000);Worker w2 =new Worker("农民工",8000);Worker w3 =new Worker("程序猿",5000);TreeSet<Worker> employees =new TreeSet<Worker>();employees.add(w1);employees.add(w2);employees.add(w3);System.out.println(employees);}}
NO.2:TreeSet借用comparator比较器成为排序业务类

import java.util.TreeSet;/** * 采用提供耦的方式:业务排序类 * @author Administrator * */public class TreeSetDemo {public static void main(String[] args) {Person p1 =new Person("您",100);Person p2 =new Person("刘德华",1000);Person p3 =new Person("梁朝伟",1200);Person p4 =new Person("老裴",50);//依次存放到TreeSet容器中,使用排序的业务类(匿名内部类)TreeSet<Person> persons =new TreeSet<Person>(new java.util.Comparator<Person>(){@Overridepublic int compare(Person o1, Person o2) {return -(o1.getHandsome()-o2.getHandsome());}});persons.add(p1);//TreeSet 在添加数据时就开始排序,边比较边添加persons.add(p2);persons.add(p3);persons.add(p4);System.out.println(persons);/*//改变数据p4.setHandsome(100);p4.setName("您");*/ //p4 与p1 内容重复 System.out.println(persons);}}
NO.3:TreeMap结合comparable成为实体比较类进行排序

import java.util.TreeMap;public class TreeMapDemo02 {/** * @param args */public static void main(String[] args) {Worker w1 =new Worker("垃圾回收员",12000);Worker w2 =new Worker("农民工",8000);Worker w3 =new Worker("程序猿",5000);//由于实体类已经实现了comparable接口,所以不用再加什么比较器了TreeMap<Worker,String > employees =new TreeMap<Worker,String >();employees.put(w1,"bjsxt");employees.put(w2,"bjsxt");employees.put(w3,"bjsxt");System.out.println(employees.keySet());}}
NO.4:TreeMap借用comparator比较器成为排序业务类

import java.util.Set;import java.util.TreeMap;public class TreeMapDemo {public static void main(String[] args) {Person p1 =new Person("您",100);Person p2 =new Person("刘德华",1000);Person p3 =new Person("梁朝伟",1200);Person p4 =new Person("老裴",50);//这里必须在构造方法里面提高一个比较器,使得person可以转化为comparator,再重写conpare方法(这里加上负号实现了降序)来实现排序TreeMap<Person,String> map =new TreeMap<Person,String>(new java.util.Comparator<Person>(){@Overridepublic int compare(Person o1, Person o2) {return -(o1.getHandsome()-o2.getHandsome());}} );map.put(p1, "bjsxt");map.put(p2, "bjsxt");map.put(p3, "bjsxt");map.put(p4, "bjsxt");//查看键Set<Person> persons =map.keySet();System.out.println(persons);}}
本篇的第二个内容是借用collections工具类的几个常见的方法来模拟斗地主洗牌、发牌过程,部分细节解释在代码的注释部分:

import java.util.ArrayList;import java.util.Collections;import java.util.List;/** * 常见方法介绍: *1、 binarySearch(List<? extends Comparable<? super T>> list, T key)   容器有序 *2、sort(List<T> list)   //排序     sort(List<T> list, Comparator<? super T> c)  *3、reverse(List<?> list)   //元素反转  4、shuffle(List<?> list) 洗牌  5、swap(List<?> list, int i, int j)   将两个指定容器对应的索引进行交换 */public class CollectionsDemo01 {public static void main(String[] args) {List<Integer> cards =new ArrayList<Integer>();//shuffle 洗牌 模拟斗地主for(int i=0;i<54;i++){cards.add(i); }//洗牌Collections.shuffle(cards) ;//依次发牌List<Integer> p1 =new ArrayList<Integer>();List<Integer> p2 =new ArrayList<Integer>();List<Integer> p3 =new ArrayList<Integer>();List<Integer> last =new ArrayList<Integer>();  //底牌for(int i=0;i<51;i+=3){  //留三张底牌p1.add(cards.get(i));p2.add(cards.get(i+1));p3.add(cards.get(i+2));}//最后三张为底牌last.add(cards.get(51));last.add(cards.get(52));last.add(cards.get(53));System.out.println("第一个人:"+p1);System.out.println("第二个人:"+p2);System.out.println("第三个人:"+p3);System.out.println("底牌为:"+last);}//反转public static void test1(){List<Integer> list =new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);System.out.println(list);Collections.reverse(list);System.out.println("反转之后"+list);}}









0 0
原创粉丝点击