Java基础[集合]

* A:集合的由来
    * 数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少 
* B:数组和集合的区别
    * 区别1 : 
        * 数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
        * 集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象
    * 区别2:
        * 数组长度是固定的,不能自动增长
        * 集合的长度的是可变的,可以根据元素的增加而增长
* C:数组和集合什么时候用
        * 1,如果元素个数是固定的推荐用数组
        * 2,如果元素个数不是固定的推荐用集合

* 集合框架(对象数组的概述和使用)

Student[] arr = new Student[5];                    //存储学生对象
arr[0] = new Student("张三", 23);
arr[1] = new Student("李四", 24);
arr[2] = new Student("王五", 25);
arr[3] = new Student("赵六", 26);
arr[4] = new Student("马哥", 20);
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}
* 数组和集合存储引用数据类型,存的都是地址值

* Collection集合的基本功能测试

基本功能演示
boolean add(E e)
boolean remove(Object o)
void clear()
boolean contains(Object o)
boolean isEmpty()
int size()
boolean addAll(Collection c) // 将c中的元素添加到集合中,而add是将整个集合当成一个对象添加到集合中
boolean removeAll(Collection c) // 删除的是交集
boolean containsAll(Collection c) // 判断调用的集合是否包含传入的集合
boolean retainAll(Collection c) // 判断调用的集合是否改变,改变为true, 不变为false  ;默认是取交集后,赋值给调用集合,然后再判断是否改变

基础集合:
Collection c = new ArrayList(); //父类引用指向子类对象 --定义的有序集合,由索引可重复 ;还有一种是无序集合,由索引,不可重复
boolean b1 = c.add("abc");    // true
boolean b2 = c.add(true);       // true 
boolean b3 = c.add(100);        // true
boolean b4 = c.add("abc");     // true
System.out.println(c);


集合遍历:

Collection coll = new ArrayList();
coll.add(new Student("张三",23));  //Object obj = new Student("张三",23);
coll.add(new Student("李四",24));
coll.add(new Student("王五",25));
coll.add(new Student("赵六",26));
Object[] arr = coll.toArray(); //将集合转换成数组,权限提升[向上转型],  变成都为object对象

for (int i = 0; i < arr.length; i++) {
    Student s = (Student)arr[i];            //强转成Student, 向下转型
    System.out.println(s.getName() + "," + s.getAge());
}

集合进行迭代:

Collection c = new ArrayList();
c.add("a");
c.add("b");
c.add("c");
c.add("d");

Iterator it = c.iterator();                        //获取迭代器的引用
while(it.hasNext()) {                            //集合中的迭代方法(遍历)
    System.out.println(it.next());
}

* A:迭代器原理

    * 迭代器原理:迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么就需要在每一个类中定义hasNext()和next()方法,这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己迭代方式,这样做的好处有二,第一规定了整个集合体系的遍历方式都是hasNext()和next()方法,第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可

* A:List集合的特有功能概述

    * void add(int index,E element)
    * E remove(int index)  // 传入的参数是整数会当成索引
    * E get(int index)
    * E set(int index,E element)
    * 通过size()和get()方法结合使用遍历。

    List list = new ArrayList();
    list.add(new Student("张三", 18));
    list.add(new Student("李四", 18));
    list.add(new Student("王五", 18));
    list.add(new Student("赵六", 18));

    for(int i = 0; i < list.size(); i++) {
        Student s = (Student)list.get(i);
        System.out.println(s.getName() + "," + s.getAge());
    }

* A:案例演示
    * 需求:我有一个集合,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。
            List list = new ArrayList();
            list.add("a");
            list.add("b");
            list.add("world");
            list.add("d");
            list.add("e");            

            /*Iterator it = list.iterator();
            while(it.hasNext()) {
                String str = (String)it.next();
                if(str.equals("world")) {
                    list.add("javaee");            //这里会抛出ConcurrentModificationException并发修改异常
                }
            }*/

* B:ConcurrentModificationException出现
    * 迭代器遍历,集合修改集合

* C:解决方案
    * a:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)
    * b:集合遍历元素,集合修改元素
            ListIterator lit = list.listIterator();        //如果想在遍历的过程中添加元素,可以用ListIterator中的add方法
            while(lit.hasNext()) {
                String str = (String)lit.next();
                if(str.equals("world")) {
                    lit.add("javaee");    
                    //list.add("javaee");
                }
            }

  * boolean hasNext()是否有下一个
  * boolean hasPrevious()是否有前一个
  * Object next()返回下一个元素
  * Object previous();返回上一个元素

* A:Vector类概述

* B:Vector类特有功能

    * public void addElement(E obj)
    * public E elementAt(int index)
    * public Enumeration elements()

* C:案例演示

* Vector的迭代
    Vector v = new Vector();                //创建集合对象,List的子类
    v.addElement("a");
    v.addElement("b");
    v.addElement("c");
    v.addElement("d");

    //Vector迭代
    Enumeration en = v.elements();            //获取枚举
    while(en.hasMoreElements()) {            //判断集合中是否有元素
        System.out.println(en.nextElement());//获取集合中的元素
    }

* A:LinkedList链表的特有功能概述

import java.util.Iterator;
import java.util.LinkedList;

public class Demo8 {
    public static void main(String[] args) {
        LinkedList list= new LinkedList();
        list.add("张三");
        list.add("李四");
        list.add("王五");

        /*
        list.addFirst("狗娃"); //把元素添加到集合的首位置上。
        list.addLast("狗剩");  //把元素添加到集合的末尾处。
        System.out.println("获取集合中首位置的元素:"+list.getFirst());
        System.out.println("获取集合中末尾的元素:"+ list.getLast());
        System.out.println("删除集合中的首位置元素并返回:"+ list.removeFirst());
        System.out.println("删除集合中的末尾素并返回:"+ list.removeLast());
        list.push("狗娃");   //将该元素插入此集合的开头处。
        System.out.println("删除集合的首元素:"+list.pop()); //移除并返回集合中的第一个元素
        list.offer("狗剩");
        System.out.println("删除集合的首元素: "+list.poll());
        System.out.println("集合中的元素:"+ list);
        */    

        Iterator  it = list.descendingIterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

集合框架(List的三个子类的特点)

* A:List的三个子类的特点

        ArrayList:

            底层数据结构是数组,查询快,增删慢。

            线程不安全,效率高。

        Vector:

            底层数据结构是数组,查询快,增删慢。

            线程安全,效率低。

        Vector相对ArrayList查询慢(线程安全的)

        Vector相对LinkedList增删慢(数组结构)

        LinkedList:

            底层数据结构是链表,查询慢,增删快。

            线程不安全,效率高。

        Vector和ArrayList的区别

            Vector是线程安全的,效率低

            ArrayList是线程不安全的,效率高

        共同点:都是数组实现的

        ArrayList和LinkedList的区别

            ArrayList底层是数组结果,查询和修改快

            LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢

        共同点:都是线程不安全的

* B:List有三个儿子,我们到底使用谁呢?

        查询多用ArrayList

        增删多用LinkedList

        如果都多ArrayList

## 集合框架(HashSet存储字符串并遍历)
* A:Set集合概述及特点
	* 通过API查看即可
* B:案例演示
	* HashSet存储字符串并遍历
	* 
		 	HashSet<String> hs = new HashSet<>();
			boolean b1 = hs.add("a");
			boolean b2 = hs.add("a");			//当存储不成功的时候,返回false
			
			System.out.println(b1);
			System.out.println(b2);
			for(String s : hs) {
				System.out.println(s);
			}

## 集合框架(HashSet存储自定义对象保证元素唯一性)
* A:案例演示
	* 存储自定义对象,并保证元素唯一性。

			HashSet<Person> hs = new HashSet<>();
			hs.add(new Person("张三", 23));
			hs.add(new Person("张三", 23));
			hs.add(new Person("李四", 23));
			hs.add(new Person("李四", 23));
			hs.add(new Person("王五", 23));
			hs.add(new Person("赵六", 23));
* 重写hashCode()和equals()方法
* B:代码优化
	* 为了减少比较,优化hashCode()代码写法。
	* 最终版就是自动生成即可。

* 1.HashSet如何保证元素唯一性的原理
	* 我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降低了使用equals()方法的次数
	* 当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象
		* 如果没有哈希值相同的对象就直接存入集合
		* 如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存
* 2.将自定义类的对象存入HashSet去重复
	* 类中必须重写hashCode()和equals()方法
	* hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)
	* equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储


## 集合框架(LinkedHashSet的概述和使用)
* A:LinkedHashSet的特点
* B:案例演示
	* LinkedHashSet的特点
		* 可以保证怎么存就怎么取 

* A:案例演示
	* 需求:编写一个程序,获取10个1至20的随机数,要求随机数不能重复。并把最终的随机数输出到控制台。
	* 
			HashSet<Integer> hs = new HashSet<>();		//创建集合对象
			Random r = new Random();					//创建随机数对象
			
			while(hs.size() < 10) {
				int num = r.nextInt(20) + 1;			//生成1到20的随机数
				hs.add(num);
			}
			
			for (Integer integer : hs) {				//遍历集合
				System.out.println(integer);			//打印每一个元素
			}


* 使用Scanner从键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符
	* aaaabbbcccddd

			Scanner sc = new Scanner(System.in);			//创建键盘录入对象
			System.out.println("请输入一行字符串:");
			String line = sc.nextLine();					//将键盘录入的字符串存储在line中
			char[] arr = line.toCharArray();				//将字符串转换成字符数组
			HashSet<Character> hs = new HashSet<>();		//创建HashSet集合对象
			
			for(char c : arr) {								//遍历字符数组
				hs.add(c);									//将字符数组中的字符添加到集合中
			}
			
			for (Character ch : hs) {						//遍历集合
				System.out.println(ch);
			}

* 将集合中的重复元素去掉
* 
			public static void main(String[] args) {
				ArrayList<String> list = new ArrayList<>();
				list.add("a");
				list.add("a");
				list.add("a");
				list.add("b");
				list.add("b");
				list.add("b");
				list.add("b");
				list.add("c");
				list.add("c");
				list.add("c");
				list.add("c");
				
				System.out.println(list);
				System.out.println("去除重复后:");
				getSingle(list);
				System.out.println(list);
			}
			
			/*
			 * 将集合中的重复元素去掉
			 * 1,void
			 * 2,List<String> list
			 */
			
			public static void getSingle(List<String> list) {
				LinkedHashSet<String> lhs = new LinkedHashSet<>();
				lhs.addAll(list);									//将list集合中的所有元素添加到lhs
				list.clear();										//清空原集合
				list.addAll(lhs);									//将去除重复的元素添回到list中
			}

## 集合框架(TreeSet原理)
* 1.特点
	* TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
* 2.使用方式
	* a.自然顺序(Comparable)
		* TreeSet类的add()方法中会把存入的对象提升为Comparable类型
		* 调用对象的compareTo()方法和集合中的对象比较
		* 根据compareTo()方法返回的结果进行存储
	* b.比较器顺序(Comparator)
		* 创建TreeSet的时候可以制定 一个Comparator
		* 如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
		* add()方法内部会自动调用Comparator接口中compare()方法排序
		* 调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
	* c.两种方式的区别
		* TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
		* TreeSet如果传入Comparator, 就优先按照Comparator

* 在一个集合中存储了无序并且重复的字符串,定义一个方法,让其有序(字典顺序),而且还不能去除重复

public static void main(String[] args) {
	ArrayList<String> list = new ArrayList<>();
	list.add("ccc");
	list.add("ccc");
	list.add("aaa");
	list.add("aaa");
	list.add("bbb");
	list.add("ddd");
	list.add("ddd");
				
	sort(list);
	System.out.println(list);
}
			
/*
* 对集合中的元素排序,并保留重复
* 1,void
* 2,List<String> list
*/
public static void sort(List<String> list) {
    // 使用Tree进行排序,但是会去掉重复的数值,所以需要改写底层的comparator进行保留重复
	TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {		
        //定义比较器(new Comparator(){}是Comparator的子类对象); 改写保留重复
		@Override
		public int compare(String s1, String s2) {						
            //重写compare方法
			int num = s1.compareTo(s2);									
            //比较内容
			return num == 0 ? 1 : num;									
            //如果内容一样返回一个不为0的数字即可
        }
    });
				
    ts.addAll(list);													
    //将list集合中的所有元素添加到ts中
	list.clear();														
    //清空list
    list.addAll(ts);													
    //将ts中排序并保留重复的结果在添加到list中
}

* 从键盘接收一个字符串, 程序对其中所有字符进行排序,例如键盘输入: helloitcast程序打印:acehillostt


Scanner sc = new Scanner(System.in);			//创建键盘录入对象
System.out.println("请输入一行字符串:");
String line = sc.nextLine();					//将键盘录入的字符串存储在line中
char[] arr = line.toCharArray();				//将字符串转换成字符数组
TreeSet<Character> ts = new TreeSet<>(new Comparator<Character>() {
    @Override
    public int compare(Character c1, Character c2) {
        //int num = c1.compareTo(c2);
        int num = c1 - c2;					//自动拆箱
        return num == 0 ? 1 : num;
	}
});
		
for(char c : arr) {
    ts.add(c);
}
		
for(Character ch : ts) {
    System.out.print(ch);
}

* 程序启动后, 可以从键盘输入接收多个整数, 直到输入quit时结束输入. 把所有输入的整数倒序排列打印.

Scanner sc = new Scanner(System.in);		//创建键盘录入对象
System.out.println("请输入:");
TreeSet<Integer> ts = new TreeSet<>(new Comparator<Integer>() {
    //将比较器传给TreeSet的构造方法
    @Override
    public int compare(Integer i1, Integer i2) {
        //int num = i2 - i1;					
        //自动拆箱
        int num = i2.compareTo(i1);
        return num == 0 ? 1 : num;
		}
});
			
while(true) {
    String line = sc.nextLine();			//将键盘录入的字符串存储在line中
    if("quit".equals(line))					
        //如果字符串常量和变量比较,常量放前面,这样不会出现空指针异常,变量里面可能存储null
	    break;
	try {
		int num = Integer.parseInt(line);		//将数字字符串转换成数字
		ts.add(num);
	} catch (Exception e) {
			System.out.println("您录入的数据有误,请输入一个整数");
	}	
}

for (Integer i : ts) {						//遍历TreeSet集合
    System.out.println(i);
 }


* A:案例演示
	* 需求:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台。
			Scanner sc = new Scanner(System.in);
			System.out.println("请输入5个学生成绩格式是:(姓名,语文成绩,数学成绩,英语成绩)");
			TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {
				@Override
				public int compare(Student s1, Student s2) {
					int num = s2.getSum() - s1.getSum();			//根据学生的总成绩降序排列
					return num == 0 ? 1 : num;
				}
			});
			
			while(ts.size() < 5) {
				String line = sc.nextLine();
				try {
					String[] arr = line.split(",");
					int chinese = Integer.parseInt(arr[1]);				//转换语文成绩
					int math = Integer.parseInt(arr[2]);				//转换数学成绩
					int english = Integer.parseInt(arr[3]);				//转换英语成绩
					ts.add(new Student(arr[0], chinese, math, english));
				} catch (Exception e) {
					System.out.println("录入格式有误,输入5个学生成绩格式是:(姓名,语文成绩,数学成绩,英语成绩");
				}
				
			}
			
			System.out.println("排序后的学生成绩是:");
			for (Student s : ts) {
				System.out.println(s);
			}


* 1.List
    * a.普通for循环, 使用get()逐个获取
    * b.调用iterator()方法得到Iterator, 使用hasNext()和next()方法
    * c.增强for循环, 只要可以使用Iterator的类都可以用
    * d.Vector集合可以使用Enumeration的hasMoreElements()和nextElement()方法
* 2.Set
    * a.调用iterator()方法得到Iterator, 使用hasNext()和next()方法
    * b.增强for循环, 只要可以使用Iterator的类都可以用
* 3.普通for循环,迭代器,增强for循环是否可以在遍历的过程中删除 
 

## 集合框架(Map集合概述和特点)
* A:Map接口概述
	* 查看API可以知道:
		* 将键映射到值的对象
		* 一个映射不能包含重复的键
		* 每个键最多只能映射到一个值
* B:Map接口和Collection接口的不同
	* Map是双列的,Collection是单列的
	* Map的键唯一,Collection的子体系Set是唯一的
	* Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效
	
* A:Map集合的功能概述
	* a:添加功能
		* V put(K key,V value):添加元素。
			* 如果键是第一次存储,就直接存储元素,返回null
			* 如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
	* b:删除功能
		* void clear():移除所有的键值对元素
		* V remove(Object key):根据键删除键值对元素,并把值返回
	* c:判断功能
		* boolean containsKey(Object key):判断集合是否包含指定的键
		* boolean containsValue(Object value):判断集合是否包含指定的值
		* boolean isEmpty():判断集合是否为空
	* d:获取功能
		* Set<Map.Entry<K,V>> entrySet():
		* V get(Object key):根据键获取值
		* Set<K> keySet():获取集合中所有键的集合
		* Collection<V> values():获取集合中所有值的集合
	* e:长度功能
		* int size():返回集合中的键值对的个数


## 框架(Map集合的遍历之键找值)
* A:键找值思路:
	* 获取所有键的集合
	* 遍历键的集合,获取到每一个键
	* 根据键找值
* B:案例演示
	* Map集合的遍历之键找值

HashMap<String, Integer> hm = new HashMap<>();
hm.put("张三", 23);
hm.put("李四", 24);
hm.put("王五", 25);
hm.put("赵六", 26);

/*Set<String> keySet = hm.keySet();			//获取集合中所有的键
Iterator<String> it = keySet.iterator();	//获取迭代器
while(it.hasNext()) {						//判断单列集合中是否有元素
	String key = it.next();					//获取集合中的每一个元素,其实就是双列集合中的键
	Integer value = hm.get(key);			//根据键获取值
	System.out.println(key + "=" + value);	//打印键值对
}*/

for(String key : hm.keySet()) {				//增强for循环迭代双列集合第一种方式
	System.out.println(key + "=" + hm.get(key));
}


* A:键值对对象找键和值思路:
	* 获取所有键值对对象的集合
	* 遍历键值对对象的集合,获取到每一个键值对对象
	* 根据键值对对象找键和值
* B:案例演示
	* Map集合的遍历之键值对对象找键和值
	
HashMap<String, Integer> hm = new HashMap<>();
hm.put("张三", 23);
hm.put("李四", 24);
hm.put("王五", 25);
hm.put("赵六", 26);
/*Set<Map.Entry<String, Integer>> entrySet = hm.entrySet();	//获取所有的键值对象的集合
Iterator<Entry<String, Integer>> it = entrySet.iterator();//获取迭代器
while(it.hasNext()) {
	Entry<String, Integer> en = it.next();				//获取键值对对象
	String key = en.getKey();								//根据键值对对象获取键
	Integer value = en.getValue();							//根据键值对对象获取值
	System.out.println(key + "=" + value);
}*/

for(Entry<String,Integer> en : hm.entrySet()) {
	System.out.println(en.getKey() + "=" + en.getValue());
}
	

* A:案例演示
	* 需求:统计字符串中每个字符出现的次数
			String str = "aaaabbbcccccccccc";
			char[] arr = str.toCharArray();						//将字符串转换成字符数组
			HashMap<Character, Integer> hm = new HashMap<>();	//创建双列集合存储键和值
			
			for(char c : arr) {									//遍历字符数组
				/*if(!hm.containsKey(c)) {						//如果不包含这个键
					hm.put(c, 1);								//就将键和值为1添加
				}else {											//如果包含这个键
					hm.put(c, hm.get(c) + 1);					//就将键和值再加1添加进来
				}
				
				//hm.put(c, !hm.containsKey(c) ? 1 : hm.get(c) + 1);
				Integer i = !hm.containsKey(c) ? hm.put(c, 1) : hm.put(c, hm.get(c) + 1);
						}
			
			for (Character key : hm.keySet()) {					//遍历双列集合
				System.out.println(key + "=" + hm.get(key));
			}


## 集合框架(HashMap和Hashtable的区别)
	* HashMap和Hashtable的区别
		* Hashtable是JDK1.0版本出现的,是线程安全的,效率低,HashMap是JDK1.2版本出现的,是线程不安全的,效率高
		* Hashtable不可以存储null键和null值,HashMap可以存储null键和null值
* B:案例演示	
	* HashMap和Hashtable的区别

## 集合框架(Collections工具类的概述和常见方法讲解)
* A:Collections类概述
	* 针对集合操作 的工具类
* B:Collections成员方法
* 
public static <T> void sort(List<T> list)
public static <T> int binarySearch(List<?> list,T key)
public static <T> T max(Collection<?> coll)
public static void reverse(List<?> list)
public static void shuffle(List<?> list)


* 模拟斗地主洗牌和发牌,牌没有排序
//买一副扑克
String[] num = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
String[] color = {"方片","梅花","红桃","黑桃"};
ArrayList<String> poker = new ArrayList<>();

for(String s1 : color) {
	for(String s2 : num) {
		poker.add(s1.concat(s2));
	}
}

poker.add("小王");
poker.add("大王");
//洗牌
Collections.shuffle(poker);
//发牌
ArrayList<String> gaojin = new ArrayList<>();
ArrayList<String> longwu = new ArrayList<>();
ArrayList<String> me = new ArrayList<>();
ArrayList<String> dipai = new ArrayList<>();

for(int i = 0; i < poker.size(); i++) {
	if(i >= poker.size() - 3) {
		dipai.add(poker.get(i));
	}else if(i % 3 == 0) {
		gaojin.add(poker.get(i));
	}else if(i % 3 == 1) {
		longwu.add(poker.get(i));
	}else {
		me.add(poker.get(i));
	}
}

//看牌

System.out.println(gaojin);
System.out.println(longwu);
System.out.println(me);
System.out.println(dipai);


* A:案例演示
	* 模拟斗地主洗牌和发牌并对牌进行排序的代码实现

//买一副牌
String[] num = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
String[] color = {"方片","梅花","红桃","黑桃"};
HashMap<Integer, String> hm = new HashMap<>();			//存储索引和扑克牌
ArrayList<Integer> list = new ArrayList<>();			//存储索引
int index = 0;											//索引的开始值
for(String s1 : num) {
	for(String s2 : color) {
		hm.put(index, s2.concat(s1));					//将索引和扑克牌添加到HashMap中
		list.add(index);								//将索引添加到ArrayList集合中
		index++;
	}
}
hm.put(index, "小王");
list.add(index);
index++;
hm.put(index, "大王");
list.add(index);
//洗牌
Collections.shuffle(list);
//发牌
TreeSet<Integer> gaojin = new TreeSet<>();
TreeSet<Integer> longwu = new TreeSet<>();
TreeSet<Integer> me = new TreeSet<>();
TreeSet<Integer> dipai = new TreeSet<>();

for(int i = 0; i < list.size(); i++) {
	if(i >= list.size() - 3) {
		dipai.add(list.get(i)); 						//将list集合中的索引添加到TreeSet集合中会自动排序
	}else if(i % 3 == 0) {
		gaojin.add(list.get(i));
	}else if(i % 3 == 1) {
		longwu.add(list.get(i));
	}else {
		me.add(list.get(i));
	}
}

//看牌
lookPoker("高进", gaojin, hm);
lookPoker("龙五", longwu, hm);
lookPoker("冯佳", me, hm);
lookPoker("底牌", dipai, hm);

}

public static void lookPoker(String name,TreeSet<Integer> ts,HashMap<Integer, String> hm) {
System.out.print(name + "的牌是:");
for (Integer index : ts) {
	System.out.print(hm.get(index) + " ");
}

System.out.println();
}

一般在使用HashMap,HashSet的时候,在调用类中调用对象需要重写其中的hashcode和equals
一般在使用TreeMap,TreeSet的时候,在调用类中调用实现Comparetor接口并重写其compareTo方法 -- 可以做排序,默认也可以做去重复;但是修改底层的comparetor可以进行对重复的数据进行保留
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值