Java复习之集合框架

发表于:2017-9-04 10:38

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:maoqitian    来源:51Testing软件测试网采编

  Map集合的功能梳理:
  添加功能
  V put(K key,V value):添加元素。
  如果键是第一次存储,就直接存储元素,返回null
  如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
  删除功能
  void clear():移除所有的键值对元素
  V remove(Object key):根据键删除键值对元素,并把值返回
  判断功能
  boolean containsKey(Object key):判断集合是否包含指定的键
  boolean containsValue(Object value):判断集合是否包含指定的值
  boolean isEmpty():判断集合是否为空
  获取功能
  Set<Map.Entry<K,V>> entrySet():
  V get(Object key):根据键获取值
  Set<K> keySet():获取集合中所有键的集合
  Collection<V> values():获取集合中所有值的集合
  长度功能
  int size():返回集合中的键值对的个数
  Map类集合也有三种遍历方式:
  使用迭代器进行遍历
  使用增强For循环来进行遍历
  使用Map.Entry来遍历集合中的元素
  ●下面我们来看看如何实现上面三种遍历方式
  /**
   * 
   * @author 毛麒添
   * Map 集合的遍历
   */
  public class Demo {
      public static void main(String[] args) {
          Map<String ,Integer> map=new HashMap<String, Integer>();
          map.put("张三", 18);
          map.put("李四", 19);
          map.put("王五", 20);
          map.put("赵六", 21);
          
          //使用迭代器进行遍历
          /*Set<String> keySet = map.keySet();//获取所有key的集合
          Iterator<String> iterator = keySet.iterator();
          while(iterator.hasNext()){
              String key = iterator.next();
              Integer i=map.get(key);
              System.out.println(i);
          }*/
          //使用增强For循环来进行遍历
          for (String key :map.keySet()) {
              Integer integer = map.get(key);
              System.out.println(integer);
          }
  /*---------------------------使用Map.Entry来遍历集合中的元素--------------------------*/
          Set<Map.Entry<String,Integer>> en=map.entrySet();////获取所有的键值对象的集合
          /*//使用迭代器来遍历
          Iterator<Entry<String, Integer>> iterator = en.iterator();
          while(iterator.hasNext()){
              Entry<String, Integer> e=iterator.next();//获取键值对对象
              String key = e.getKey();//根据键值对对象获取键
              Integer value = e.getValue();//根据键值对对象获取值
              System.out.print(key);
              System.out.println(value);
          }*/
          //使用增强for循环来遍历
          for (Entry<String, Integer> entry : en) {
              String key = entry.getKey();
              Integer value = entry.getValue();
              System.out.print(key);
              System.out.println(value);
          }
  /*---------------------------使用Map.Entry来遍历集合中的元素--------------------------*/
      }
  }
  ●LinkHashMap与LinkHashSet一样,怎么存怎么取,保证元素唯一(key 是唯一判定值),由于保证元素唯一,其性能肯定会低一些,这里就不细说了。
  ●TreeMap是双列集合,其实他和TreeSet是很像的,但是双列集合的键是唯一标识,所以TreeMap排序的是每个元素的键。对于存储自定义对象排序,它也有Comparable和Comparator,下面我们来看例子
  /**
   * 
   * @author 毛麒添
   * TreeMap
   *  通TreeSet 原理,存取自定义对象也需要继承Comparable结构,
   *  或者实现比较器Comparator
   */
  public class Demo6_TreeMap {
      public static void main(String[] args) {
          TreeMap<Student, String> tm=new TreeMap<Student, String>(new Comparator<Student>() {
              @Override
              public int compare(Student s1, Student s2) {
                  int num=s1.getName().compareTo(s2.getName());//以姓名作为主要比较条件
                  return num==0?s1.getAge()-s2.getAge():num;
              }
          });
          tm.put(new Student("张三",13),"杭州");
          tm.put(new Student("张三",14), "贺州");
          tm.put(new Student("王五",15), "广州");
          tm.put(new Student("赵六",16), "深圳");
          
          System.out.println(tm);
      }
  }
  /**
   * 自定义对象
   * @author 毛麒添
   * HashMap 存储对象 与 HashSet 同理  需要重写 hashcode 和equals 方法 
   * TreeMap 实现 Comparable接口
   */
  public class Student implements Comparable<Student>{
      private int age;
      private String name;
      
      public Student(){
          super();
      }
      public Student(String name,int age){
          this.name=name;
          this.age=age;
      }
      public int getAge() {
          return age;
      }
      public void setAge(int age) {
          this.age = age;
      }
      public String getName() {
          return name;
      }
      public void setName(String name) {
          this.name = name;
      }
      
      
      @Override
      public String toString() {
          return "Student [age=" + age + ", name=" + name + "]";
      }
      @Override
      public int hashCode() {
          final int prime = 31;
          int result = 1;
          result = prime * result + age;
          result = prime * result + ((name == null) ? 0 : name.hashCode());
          return result;
      }
      @Override
      public boolean equals(Object obj) {
          if (this == obj)
              return true;
          if (obj == null)
              return false;
          if (getClass() != obj.getClass())
              return false;
          Student other = (Student) obj;
          if (age != other.age)
              return false;
          if (name == null) {
              if (other.name != null)
                  return false;
          } else if (!name.equals(other.name))
              return false;
          return true;
      }
      @Override
      public int compareTo(Student o) {
          int num =this.age-o.age;//以年龄为主要条件
          return num==0?this.name.compareTo(o.name):num;//姓名作为次要条件
      }   
  }
  到这里,Java集合框架的复习基本完成,最后来一个斗地主的例子对集合框架做一个综合应用,只是实现斗地主洗牌和发牌,至于怎么打牌,逻辑复杂,这里不做实现。
  /**
   * 
   * @author 毛麒添
   * 模拟斗地主洗牌和发牌,牌排序
   * 买一副扑克
   * 洗牌
   * 发牌
   * 看牌
   */
  public class Doudizhu_progress {
      public static void main(String[] args) {
          // TODO Auto-generated method stub
          //构造一副扑克牌
          String[] number={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
          String[]color={"黑桃","红桃","梅花","方块"};
          HashMap<Integer, String> pokerMap=new HashMap<Integer, String>();//存放牌的map
          ArrayList<Integer> list=new ArrayList<Integer>();//存放牌的索引
          int index=0; //索引
          for (String s1 : number) {
              for (String s2 : color) {
                  pokerMap.put(index,s2.concat(s1));
                  list.add(index);
                  index++;
              
              }
          }
          //加入大小王
          pokerMap.put(index,"小王");
          list.add(index);
          index++;
          pokerMap.put(index,"大王");
          list.add(index);
          
          //洗牌
          Collections.shuffle(list);
          //System.out.println(list);
         
          //发牌,3个人玩 加上底牌3张 使用TreeSet 来存放索引,并自动对索引排好序
          TreeSet<Integer> mao=new TreeSet<Integer>();
          TreeSet<Integer> li=new TreeSet<Integer>();
          TreeSet<Integer> huang=new TreeSet<Integer>();
          TreeSet<Integer> dipai=new TreeSet<Integer>();
          
          for(int i=0;i<list.size();i++){
              if(i>=list.size()-3){//最后三张牌,作为底牌
                 dipai.add(list.get(i));  
              }else if(i%3==0){
                  mao.add(list.get(i));
              }else if(i%3==1){
                  li.add(list.get(i));
              }else {
                  huang.add(list.get(i));
              }
          }
          
          //看牌
          lookPoker(pokerMap,mao,"mao");
          lookPoker(pokerMap,li,"li");
          lookPoker(pokerMap,huang,"huang");
          lookPoker(pokerMap,dipai,"底牌");
      }
      /**
       * 看牌的方法
       * @param pokerMap 存放牌的map
       * @param mao  该玩家的牌的索引集合
       * @param name 玩家名字
       */
      private static void lookPoker(HashMap<Integer, String> pokerMap,
              TreeSet<Integer> mao, String name) {
          if(name.equals("底牌")){
              System.out.print("地主"+name+"的牌是:");
          }else{
              System.out.print("玩家"+name+"的牌是:");
          }
          for (Integer integer : mao) {
              System.out.print(pokerMap.get(integer)+" ");
          }
          
          System.out.println();
          
      }
  }
  运行截图:
  斗地主程序运行截图.png
  写在最后:
  如果你看到这里,估计你也温故知新了吧,那就这样吧,这篇又臭又长的文章就到这里啦。文章中如果有错误,请大家给我提出来,大家一起学习进步,如果觉得我的文章给予你帮助,也请给我一个喜欢。

22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号