A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 rockybull 于 2015-12-17 18:33 编辑

集合体系:单列集合和双列集合
单列集合顶层接口Collection

一、List 有序(存取一致) 可重复
   ArrayList 数组,查询快,增删慢,不安全,高。
   Vector 数组,查询快,增删慢,安全,低。
   LinkedList 链表,查询慢,增删快,不安全,高。


二、Set 无序,唯一
   HashSet 哈希算法,不安全,高。
    如何保证元素的唯一性?
     依赖于两个方法:hashCode(),equals()
   TreeSet 二叉树,不安全,高
    如何保证元素的唯一性?
     A:自然排序。
      Comparable,compareTo()
     B:比较器接口。
      Comparator,compare()



双列集合顶层接口Map
HashMap 哈希算法,不安全,高。
  TreeMap 二叉树,不安全,高


总结:一、Collection 和 Map 的区别:
  Collection:单列集合的顶层接口, 数据结构针对元素有效,它的Set体系具有唯一性。
  Map:双列,键,键是唯一的。
Collection 和 Collections
  Collection :单列集合的顶层接口, 数据结构针对元素有效,它的Set体系具有唯一性。
  Collections :操作单列集合的工具类。
  
二、HashMap 和 Hashtable 的区别:
  HashMap: JDK1.2,线程不安全,效率高。可以存null值和键
  Hashtable: JDK1.0 线程安全,效率低。不可以存null值和键

到底使用那种集合
看需求。
看用单列还是双列:
  单列:Collection
   看是否唯一:
    是:Set
     看是否排序:
      是:TreeSet
      否:HashSet
      需求不明确,用HashSet
    否:List
     看增删多还是查询多:
      增删多:LinkedList
      查询多:ArrayList
      需求不明确,用ArrayList
  双列:Map:
   看是否排序:
    是:TreeMap
    否:HashMap
    需求不明确,用HashMap




集合的遍历主要就是增强for和迭代器。
HashSet和HashMap保证唯一是通过重写equals()和hashCode()方法。
TreeSet和TreeMap排序是通过自然排序和比较器接口排序。

斗地主洗牌用集合实现
package com.heima.set;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.TreeSet;
public class Test {                                                                 //定义一个类

public static void main(String[] args) {
  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添加牌到双列集合中,同时单列集合list增加索引
  for (String s : num) {
   for (String s1 : color) {
    hm.put(index, s1+s);
    list.add(index);
    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> xyp=new TreeSet<>();
  TreeSet<Integer> diPai=new TreeSet<>();
  for(int i=0;i<list.size();i++) {
   if(i>list.size()-4) {
    diPai.add(list.get(i));
   }
   else if(i%3==0){
    gaoJin.add(list.get(i));
   }
   else if(i%2==1) {
    longWu.add(list.get(i));
   }
   else {
    xyp.add(list.get(i));
   }
  }
  



lookPoker(hm, xyp, "xyp");                                                 //分别调用看牌方法输出玩家和底牌的牌。
  lookPoker(hm, gaoJin, "高进");
  lookPoker(hm, longWu, "龙五");
  lookPoker(hm, diPai, "底牌");
}



//看牌方法,传入54张牌的集合和玩家和底牌的索引集合,和玩家姓名。
public static void lookPoker(HashMap<Integer,String> hs,TreeSet<Integer> ts,String name) {
  System.out.println(name+"的牌是:");
  for (Integer in : ts) {
   System.out.print(hs.get(in)+" ");
  }
  System.out.println();
}
}
//运行结果



2 个回复

倒序浏览
总结的不错,很有用,赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞
回复 使用道具 举报 1 0
总结的不错啊,以后继续努力 啊
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马