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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始







6、集合

6.2 集合类

    6.2.5 Map、HashMap、TreeMap

    使用LinkedHashMap则是跟原来存入的顺序是一致的。

    示例7:
  1. import java.util.HashMap;
  2. import java.util.Iterator;
  3. import java.util.LinkedHashMap;
  4. import java.util.Map;

  5. public class LinkedHashMapDemo{
  6.        public static void main(String[] args){
  7.             HashMap<Integer,String> hm = new LinkedHashMap<Integer,String>();

  8.             hm.put(7, "zhouqi");
  9.             hm.put(3, "zhangsan");
  10.             hm.put(1, "qianyi");
  11.             hm.put(5, "wangwu");

  12.             Iterator<Map.Entry<Integer,String>> it = hm.entrySet().iterator();

  13.              while(it.hasNext()){
  14.                   Map.Entry<Integer,String> me = it.next();

  15.                   Integer key = me.getKey();
  16.                   String value = me.getValue();

  17.                   System.out. println(key + ":" + value);
  18.             }
  19.       }
  20. }
复制代码
    运行结果:

    练习:
    “fdqavcbsacdfs”获取该字符串中,每一个字母出现的次数。
     要求打印结果是:a(2)b(1)...;


    思路:
    对于结果的分析发现,字母和次数之间存在着映射的关系,而且这种关系很多。
    很多就需要存储,能存储映射关系的容器有数组和Map结合。
    关系中没有编号!那就使用Map结合。
    又发现可以保证唯一性的一方具备着顺序,如a、b、c...
    所以可以使用TreeMap集合。

    这个集合最终应该存储的是字母和次数的对应关系。
    1. 因为操作的是字符串中的字母,所以先将字符串变成字符数组。
    2. 遍历字符数组,用每一个字母作为键去查Map集合这个值。
    如果该字母键不存在,就将该字母作为键,1作为值存储到map集合中。
    如果该字母键存在,就将该字母键对应值取出并+1,再将该字母和+1后的值存储到map集合中。键相同值会覆盖,这样就记录住了该字母的次数。

    3. 遍历结果,map集合就记录所有字母的出现的次数。

    代码:
  1. import java.util.Iterator;
  2. import java.util.Map;
  3. import java.util.TreeMap;

  4. public class MapTest{
  5.        public static void main(String[] args){
  6.             String str = "fdqavcbsacdfs";

  7.             String s = getCharCount(str);

  8.             System.out.println(s);
  9.       }

  10.        public static String getCharCount(String str){
  11.              //将字符串变为字符数组
  12.              char[] chs = str.toCharArray();
  13.             
  14.              //定义map集合表
  15.             Map<Character,Integer> map = new TreeMap<Character,Integer>();
  16.             
  17.              for(int i = 0; i < chs.length; i++){
  18.                    if(!(chs[i] >= 'a' && chs[i] <= 'z' || chs[i] >= 'A' && chs[i] <= 'Z' ))
  19.                          continue;

  20.                    //将数组中的字母作为键去查map表
  21.                   Integer value = map.get(chs[i]);
  22.                   
  23.                    int count = 0;

  24.                    //判断值是否为null
  25.                    if(value!=null){
  26.                         count = value;
  27.                   }
  28.                   count++;

  29.                   map.put(chs[i],count);
  30.             }

  31.              return mapToString(map);
  32.       }

  33.        private static String mapToString(Map<Character,Integer> map){
  34.             StringBuilder sb = new StringBuilder();

  35.             Iterator<Character> it = map.keySet().iterator();

  36.              while(it.hasNext()){
  37.                   Character key = it.next();
  38.                   Integer value = map.get(key);

  39.                   sb.append(key + "(" + value + ")" );
  40.             }
  41.              return sb.toString();
  42.       }
  43. }
复制代码
   运行结果:

    Map在有映射关系时,可以优先考虑,在查表法中的应用较为多见。  

    示例:
  1. import java.util.HashMap;
  2. import java.util.Map;

  3. public class MapTest{
  4.        public static void main(String[] args){
  5.             String week = getWeek(1);
  6.             System.out.println(week);

  7.             System.out.println(getWeekByMap(week));
  8.       }

  9.        public static String getWeekByMap(String week){
  10.             Map<String,String> map = new HashMap<String,String>();
  11.             
  12.             map.put( "星期一","Mon" );
  13.             map.put( "星期二","Tue" );
  14.             map.put( "星期三","Wes" );
  15.             map.put( "星期日","Sun" );
  16.             map.put( "星期天","Sun" );
  17.             
  18.              return map.get(week);
  19.       }

  20.        public static String getWeek(int week){
  21.              if(week<1 || week>7)
  22.                    throw new RuntimeException("没有对应的星期,请您重新输入" );

  23.             String[] weeks = { "","星期一" ,"星期二" };
  24.       
  25.              return weeks[week];
  26.       }
  27. }
复制代码
    运行结果:

    6.2.6 Collections工具类

    Collections:是集合框架的工具类,里面的方法都是静态的。

    示例1:
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. import java.util.List;

  5. public class CollectionsDemo{
  6.        public static void main(String[] args){
  7.              demo1();
  8.       }

  9.        public static void demo1(){
  10.             List<String> list = new ArrayList<String>();

  11.             list.add( "abcde");
  12.             list.add( "cba");
  13.             list.add( "aa");
  14.             list.add( "zzz");
  15.             list.add( "cba");
  16.             list.add( "nbaa");

  17.              //对list集合进行指定顺序的排序
  18.             Collections. sort(list);
  19.             System. out.println(list);

  20.             Collections. sort(list,new ComparatorByLength());
  21.             System. out.println(list);
  22.             
  23.              mySort(list,new ComparatorByLength());
  24.             System. out.println(list);
  25.       }

  26.        public static <T> void mySort(List<T> list,Comparator<? super T> comp){
  27.              for(int i = 0; i < list.size() - 1; i++){
  28.                    for(int j = i + 1; j < list.size(); j++){
  29.                          if(comp.compare(list.get(i),list.get(j))>0){
  30.                               Collections. swap(list ,i,j);
  31.                         }
  32.                   }
  33.             }
  34.       }
  35. }

  36. class ComparatorByLength implements Comparator<String>{
  37.        public int compare(String o1,String o2){
  38.              int temp = o1.length() - o2.length();
  39.              return temp == 0?o1.compareTo(o2):temp;
  40.       }
  41. }
复制代码
    运行结果:

    示例2:  
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. import java.util.List;

  5. public class CollectionsDemo{
  6.        public static void main(String[] args){
  7.             demo2();
  8.       }

  9.        public static void demo2(){
  10.             List<String> list = new ArrayList<String>();

  11.             list.add( "abcde");
  12.             list.add( "cba");
  13.             list.add( "aa");
  14.             list.add( "zzz");
  15.             list.add( "cba");
  16.             list.add( "nbaa");
  17.       
  18.             Collections.sort(list);
  19.             System.out.println(list);

  20.              int index = Collections.binarySearch(list,"aaa");
  21.             System.out.println( "index = " + index);//-2 -index-1

  22.              //获取最大值
  23.             String max = Collections.max(list, new ComparatorByLength());
  24.             System.out.println( "max = " + max);
  25.       }
  26. }

  27. class ComparatorByLength implements Comparator<String>{
  28.        public int compare(String o1,String o2){
  29.              int temp = o1.length() - o2.length();
  30.              return temp == 0?o1.compareTo(o2):temp;
  31.       }
  32. }
复制代码
    运行结果:

    原因分析:


    示例3:
  1. import java.util.Collections;
  2. import java.util.Comparator;
  3. import java.util.TreeSet;

  4. public class CollectionsDemo{
  5.        public static void main(String[] args){
  6.             demo3();
  7.       }

  8.        public static void demo3(){
  9.             TreeSet<String> ts = new TreeSet<String>(Collections.reverseOrder());

  10.             ts = new TreeSet<String>(Collections.reverseOrder(new ComparatorByLength()));

  11.             ts.add( "abc");
  12.             ts.add( "hahaha");
  13.             ts.add( "zzz");
  14.             ts.add( "aa");
  15.             ts.add( "cba");

  16.             System.out.println(ts);
  17.       }
  18. }

  19. class ComparatorByLength implements Comparator<String>{
  20.     public int compare(String o1,String o2){
  21.           int temp = o1.length() - o2.length();
  22.           return temp == 0?o1.compareTo(o2):temp;
  23.    }
  24. }
复制代码
    运行结果:

    示例4:
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;

  4. public class CollectionsDemo{
  5.        public static void main(String[] args){
  6.              demo4();
  7.       }

  8.        public static void demo4(){
  9.             List<String> list = new ArrayList<String>();

  10.             list.add( "abcde");
  11.             list.add( "cba");
  12.             list.add( "aa");

  13.             System. out.println(list);
  14.             Collections. replaceAll(list,"cba", "nba");
  15.             System. out.println(list);
  16.       }
  17. }
复制代码
    运行结果:

    示例5:
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;

  4. public class CollectionsDemo{
  5.        public static void main(String[] args){
  6.              demo5();
  7.       }

  8.        public static void demo5(){
  9.             List<String> list = new ArrayList<String>();

  10.             list.add( "abcde");
  11.             list.add( "cba");
  12.             list.add( "zhangsan");
  13.             list.add( "zhaoliu");
  14.             list.add( "xiaoqiang");

  15.             System. out.println(list);
  16.             Collections. shuffle(list);
  17.             System. out.println(list);
  18.       }
  19. }
复制代码
    运行结果:

    原因分析:


    练习:
    给非同步的集合加锁。

    代码:
  1. import java.util.ArrayList;
  2. import java.util.List;

  3. class MyCollections{
  4.        public List synList(List list){
  5.              return new MyList(list);
  6.       }

  7.        private class MyList extends ArrayList{
  8.              private List list;

  9.              private final Object lock = new Object();

  10.              MyList(List list){
  11.                    this.list = list;
  12.              }
  13.       
  14.              public boolean add(Object obj){
  15.                    synchronized(lock){
  16.                          return list.add(obj);
  17.                   }
  18.             }
  19.       
  20.              public boolean remove(Object obj){
  21.                    synchronized(lock){
  22.                          return list.remove(obj);
  23.                   }
  24.             }
  25.       }
  26. }

  27. class Test{
  28.        public static void main(String[] args) {
  29.             List list = new ArrayList();//非同步的
  30.             list = new MyCollections().synList(list);//同步的
  31.       }
  32. }
复制代码

    6.2.7 Arrays工具类  
    Arrays:集合框架的工具类,里面的方法都是静态的。

    示例1:
  1. import java.util.Arrays;

  2. class ArraysDemo{
  3.        public static void main(String[] args){
  4.              int[] arr = {3,1,5,6,4,7};
  5.             System.out.println(Arrays.toString(arr));
  6.       }
  7. }
复制代码
    运行结果:



    重点:List asList(数组)将数组转成集合。
    好处:可以使用集合的方法操作数组。

    示例2:
  1. import java.util.Arrays;
  2. import java.util.List;

  3. class ArraysDemo{
  4.        public static void main(String[] args){
  5.             String[] arr = { "abc","haha" ,"xixi" };
  6.             
  7.             List<String> list = Arrays. asList(arr);
  8.              boolean b = list.contains("xixi" );
  9.             System. out.println(b);
  10.       }
  11. }
复制代码
   运行结果:

    P.S.
    数组的长度是固定的,所以对于结合的增删方法是不可以使用的,否则,会发生UnsupportedOperationException。

    数组转集合,用asList方法。
    如果数组中的元素是对象,那么转成集合时,直接将数组中的元素作为集合中的元素进行集合存储。
    如果数组中的元素是基本类型数值,那么会将该数组作为集合中的元素进行存储。

    示例3:
  1. import java.util.Arrays;
  2. import java.util.List;

  3. class ArraysDemo{
  4.        public static void main(String[] args){
  5.             int[] arr1 = {31,11,51,61};
  6.             List< int[]> list1 = Arrays.asList(arr1);
  7.             System.out.println(list1);

  8.             Integer[] arr2 = {31,11,51,61};
  9.             List list2 = Arrays.asList(arr2);
  10.             System.out.println(list2);
  11.       }
  12. }
复制代码
   运行结果:


    集合转数组

    使用的就是Collection接口中的toArray方法。
    集合转成数组,可以对集合中的元素操作的方法进行限定,不允许对其进行增删。

    toArray方法需要传入一个指定类型的数组。
    长度该如何定义呢?
    如果长度小于集合的size,那么该方法会创建一个同类型并和集合相同的size的数组。
    如果长度大于集合的size,那么该方法就会使用指定的数组,存储集合中的元素,其他位置默认为null。
    所以建议,最后长度就指定为,集合的size。

    示例4:
  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.List;

  4. public class ToArray{
  5.        public static void main(String[] args){
  6.             List<String> list = new ArrayList<String>();
  7.             list.add( "abc1");
  8.             list.add( "abc2");
  9.             list.add( "abc3");

  10.             String[] arr = list.toArray( new String[2]);
  11.             
  12.             System.out.println(Arrays.toString(arr));
  13.       }
  14. }
复制代码
   运行结果:

~END~



~爱上海,爱黑马~


31 个回复

倒序浏览
沙发,赞一个
回复 使用道具 举报

沙发,赞一个
回复 使用道具 举报
赞一个。。。
回复 使用道具 举报

赞一个。。。
回复 使用道具 举报
赞一个...
回复 使用道具 举报
太好了!不错!赞一个!
回复 使用道具 举报
赞一个。。。
回复 使用道具 举报
回复 使用道具 举报
牛奋 来自手机 中级黑马 2015-6-17 17:02:56
10#
阳哥真是厉害!
回复 使用道具 举报
赞一个。。。
回复 使用道具 举报
yudsda sa asd
回复 使用道具 举报
有不懂的地方就多看几了几遍,还是有点糊涂,不过东西不错!!!!!!
回复 使用道具 举报
twa42 中级黑马 2015-7-16 10:42:11
14#
阳哥辛苦了!!
回复 使用道具 举报
很棒!!!!
回复 使用道具 举报
顶一下!!
回复 使用道具 举报
谢谢分享!!
回复 使用道具 举报
很不错,感觉很详尽,努力学好!!!!!!!!!!!!!!
回复 使用道具 举报
老NB了,接着来
回复 使用道具 举报
没有二叉树么?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马