黑马程序员技术交流社区

标题: 【阳哥笔记】极速秒杀Java基础之笔记系列—Day19(集合 )! [打印本页]

作者: 阳哥忠粉    时间: 2015-6-7 12:47
标题: 【阳哥笔记】极速秒杀Java基础之笔记系列—Day19(集合 )!





笔记总链接:http://bbs.itheima.com/thread-200600-1-1.html

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~



~爱上海,爱黑马~



作者: 流水0215    时间: 2015-6-9 09:10
沙发,赞一个
作者: 魏海洲    时间: 2015-6-11 19:09

沙发,赞一个
作者: yang2015    时间: 2015-6-11 19:41
赞一个。。。
作者: 魏海洲    时间: 2015-6-12 22:33

赞一个。。。
作者: 丶半斤    时间: 2015-6-13 21:31
赞一个...
作者: 13569403973    时间: 2015-6-13 21:33
太好了!不错!赞一个!
作者: RockLee    时间: 2015-6-17 15:39
赞一个。。。
作者: RockLee    时间: 2015-6-17 16:33

作者: 牛奋    时间: 2015-6-17 17:02
阳哥真是厉害!
作者: 凌云xs    时间: 2015-6-17 20:40
赞一个。。。
作者: ym123456    时间: 2015-6-17 20:42
yudsda sa asd
作者: 星痕-凌    时间: 2015-7-8 21:45
有不懂的地方就多看几了几遍,还是有点糊涂,不过东西不错!!!!!!
作者: twa42    时间: 2015-7-16 10:42
阳哥辛苦了!!
作者: Sad_king    时间: 2015-7-16 10:51
很棒!!!!
作者: 路宪帅    时间: 2015-7-16 12:07
顶一下!!
作者: Matrix_heima    时间: 2015-7-17 15:18
谢谢分享!!
作者: 星痕-凌    时间: 2015-7-18 21:01
很不错,感觉很详尽,努力学好!!!!!!!!!!!!!!
作者: cheenbee    时间: 2015-8-3 21:41
老NB了,接着来
作者: 王勋亮    时间: 2015-8-7 12:31
没有二叉树么?
作者: 放心飞    时间: 2015-8-31 14:11
又看完一节了,继续加油。
作者: Sad_king    时间: 2015-9-1 20:58
谢谢分享啊AAA
作者: Sad_king    时间: 2015-9-1 21:00
好好学习饿  累死了
作者: yangshibai    时间: 2015-9-21 23:23
赞一个。。。
作者: Smilexs    时间: 2015-9-28 14:37
赞一个!
作者: lostyou    时间: 2015-9-28 21:48
好东西  学习了
作者: 13480153263    时间: 2015-9-28 21:54
大成功靠大痛苦浇灌而成!加油
作者: 李慧兵    时间: 2015-9-28 23:29
顶!!!!!!!!!!!
作者: kdgnbal3486    时间: 2015-9-29 11:55
刚好需要,谢谢。
作者: A20160580    时间: 2016-5-17 23:12
星痕-凌 发表于 2015-7-8 21:45
有不懂的地方就多看几了几遍,还是有点糊涂,不过东西不错!!!!!!

是的。。。。。。
作者: A20160580    时间: 2016-5-17 23:15
星痕-凌 发表于 2015-7-18 21:01
很不错,感觉很详尽,努力学好!!!!!!!!!!!!!!

我没看懂。。。。
作者: A20160580    时间: 2016-5-17 23:28
cheenbee 发表于 2015-8-3 21:41
老NB了,接着来

接着来。。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2