黑马程序员——集合(三)

来源:互联网 发布:宝塔 递推 算法 编辑:程序博客网 时间:2024/06/08 19:42

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

1、Map

Map也是一个集合,只是是以键值对存储的,常见的子类有Hashtable,HashMap,TreeMap。

Hashtable:是1.0版本,底层的数据结构是哈希表,键和值和不能是null值,线程安全,和HashMap比较,效率低。

HashMap:是1.2版本的,底层也是哈希表数据结构,键和值可以为空(null),线程不安全,效率比较高。更确切的说,HashMap是Hashtable的升级版。

TreeMap:可以排序,底层是二叉树。

2、基本操作

 [1] 添加。

put(K key, V value) 

putAll(Map<? extends K,? extends V> m) 

[2] 删除。

clear() 

remove(Object key) 

 [3] 判断。

containsValue(Object value) 

containsKey(Object key) 

isEmpty() 

[4] 获取。

get(Object key) 

size() 

values() 

3、Map-keySet

Map集合的两种取出方式:
第一种keySet:将map中所有的键存入Set集合,因为Set具备迭代器,所有可以迭代方式取出所有的键,获取每一个键对应的值。

Map<String,String> map=new Map<String,String>();

map.put("02","zhangsan2");
map.put("03","zhangsan3");
map.put("04","zhangsan4");
map.put("05","zhangsan5");

Set<String> keySet=map.keySet();

Iterator<String> it=keySet.iterator();

while(it.hasNext())
{
 String key=it.next();
 String value=map.get(key);
 输出键和值;
}

map集合的取出原理:将map集合转成set集合,再通过迭代器取出。

4、Map-entrySet

第二种entrySet:
Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到set集合中,而这个关系的数据类型就是:Map.Entry。

Set<Map.Entry<String,String>> entrySet=map.entrySet();

Iterator<Map.Entry<String,String>> it=entrySet.iterator();
while(it.hasNext())
{
 Map.Entry<String,String> me=it.next();
 String key=me.geyKey();
 String value=me.getValue();
 这样就取出来了;
}

Map.Entry其实Entry也是一个接口,它是Map接口中的一个内部接口。
interface Map
{
 public static interface Entry
 {
  public abstract Object getKey();
  public abstract Object getValue();
 }
}

5、练习

计算字符串中字符的个数,并且输出格式:a(1)b(3)c(4)….

思路:

   1.把字符串转化成字符数组后,然后开始遍历数组

   2.在遍历的时候,没读取一个字符,然后在集合中查看,如果存在则读取出来,然后数量加1,然后在存入里面如果没有,则添加里面,数量是1.

  3.输出格式,读取集合然后拼接字符串,利用StringBuffer。 

importjava.util.HashMap;

importjava.util.Iterator;

importjava.util.Map;

importjava.util.Set;

public classMapDemo {

      public static void main(String[] args) {

           String str ="ahjdkdmkamkmixkxmcsnlasickdj";

           char[] cs = str.toCharArray();

           HashMap<Character, Integer> map= new HashMap<Character, Integer>();

           for (char c : cs) {

                 if (map.containsKey(c)) {

                      Integer count =map.get(c);// 取出此字符对应的数量

                      count++;// 数量++

                      map.put(c, count);// 然后重新添加里面,覆盖原来的

                 } else {

                      map.put(c, newInteger(1));// 开始数量为1

                 }

           }

 

           StringBuffer bu = new StringBuffer();

           Set<Character> set =map.keySet();

           Iterator<Character> it =set.iterator();

           while (it.hasNext()) {

                 Character c = it.next();

                 Integer count = map.get(c);

          bu.append(c).append("(").append(count).append(")");

           }

           System.out.println(bu);

      }

}

结果:

d(3)s(2)c(2)a(3)n(1)l(1)m(4)j(2)k(5)h(1)x(2)i(2)

6、模拟学校

模拟学校,然后读取学校中班级—学生信息,利用的是集合中嵌套集合

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Set;

 

class CollegeStudent {

private Stringnum;

private Stringname;

CollegeStudent(Stringnum, String name) {

      super();

      this.num =num;

      this.name =name;

}

public StringgetNum() {

      return num;

}

public StringgetName() {

      returnname;

}

public class Demo {

public staticvoid main(String[] agrs) {

      /* 学校 */

      HashMap<String,List<CollegeStudent>> bdxy = new HashMap<String,List<CollegeStudent>>();

      List<CollegeStudent>ruanjian = new ArrayList<CollegeStudent>();// 软件班

      List<CollegeStudent>jiying = new ArrayList<CollegeStudent>();// 计应班

      /* 把班级添加到学校中 */

      bdxy.put("ruanjian",ruanjian);

      bdxy.put("jiying",jiying);

      /*向班级中添加学生*/

      ruanjian.add(newCollegeStudent("110","zhansgan") );

      ruanjian.add(newCollegeStudent("111","lisi") );

      ruanjian.add(newCollegeStudent("112","王五"));

      jiying.add(newCollegeStudent("210","wangang") );

      jiying.add(newCollegeStudent("211","wangemi") );

      jiying.add(newCollegeStudent("212","xiaoqiang") );

      /* 遍历学校中的班级,然后读取班级中的学生信息 */

 

      Set<String>set = bdxy.keySet();// 获取班级名称集合

      Iterator<String>it = set.iterator();

      while(it.hasNext()) {

            StringClassName = it.next();

            List<CollegeStudent>ClassInfo = bdxy.get(ClassName);// 获得班级

            System.out.println(ClassName);

            show(ClassInfo);

      }

}

 

/* 输出班级的学生 */

public staticvoid show(List<CollegeStudent> list) {

      Iterator<CollegeStudent>it = list.iterator();

      while(it.hasNext()) {

            CollegeStudentstu = it.next();

            System.out.println("  |-"+stu.getNum() + ":" +stu.getName());

      }

}

}

 

结果:

jiying

    |-210:wangang

    |-211:wangemi

    |-212:xiaoqiang

ruanjian

    |-110:zhansgan

    |-111:lisi

    |-112:王五

 


0 0