6、集合
6.2 集合类
6.2.5 Map、HashMap、TreeMap
使用LinkedHashMap则是跟原来存入的顺序是一致的。
示例7: - import java.util.HashMap;
- import java.util.Iterator;
- import java.util.LinkedHashMap;
- import java.util.Map;
- public class LinkedHashMapDemo{
- public static void main(String[] args){
- HashMap<Integer,String> hm = new LinkedHashMap<Integer,String>();
- hm.put(7, "zhouqi");
- hm.put(3, "zhangsan");
- hm.put(1, "qianyi");
- hm.put(5, "wangwu");
- Iterator<Map.Entry<Integer,String>> it = hm.entrySet().iterator();
- while(it.hasNext()){
- Map.Entry<Integer,String> me = it.next();
- Integer key = me.getKey();
- String value = me.getValue();
- System.out. println(key + ":" + value);
- }
- }
- }
复制代码 运行结果: 练习:
“fdqavcbsacdfs”获取该字符串中,每一个字母出现的次数。
要求打印结果是:a(2)b(1)...;
思路:
对于结果的分析发现,字母和次数之间存在着映射的关系,而且这种关系很多。
很多就需要存储,能存储映射关系的容器有数组和Map结合。
关系中没有编号!那就使用Map结合。
又发现可以保证唯一性的一方具备着顺序,如a、b、c...
所以可以使用TreeMap集合。
这个集合最终应该存储的是字母和次数的对应关系。
1. 因为操作的是字符串中的字母,所以先将字符串变成字符数组。
2. 遍历字符数组,用每一个字母作为键去查Map集合这个值。
如果该字母键不存在,就将该字母作为键,1作为值存储到map集合中。
如果该字母键存在,就将该字母键对应值取出并+1,再将该字母和+1后的值存储到map集合中。键相同值会覆盖,这样就记录住了该字母的次数。
3. 遍历结果,map集合就记录所有字母的出现的次数。
代码:
- import java.util.Iterator;
- import java.util.Map;
- import java.util.TreeMap;
- public class MapTest{
- public static void main(String[] args){
- String str = "fdqavcbsacdfs";
- String s = getCharCount(str);
- System.out.println(s);
- }
- public static String getCharCount(String str){
- //将字符串变为字符数组
- char[] chs = str.toCharArray();
-
- //定义map集合表
- Map<Character,Integer> map = new TreeMap<Character,Integer>();
-
- for(int i = 0; i < chs.length; i++){
- if(!(chs[i] >= 'a' && chs[i] <= 'z' || chs[i] >= 'A' && chs[i] <= 'Z' ))
- continue;
- //将数组中的字母作为键去查map表
- Integer value = map.get(chs[i]);
-
- int count = 0;
- //判断值是否为null
- if(value!=null){
- count = value;
- }
- count++;
- map.put(chs[i],count);
- }
- return mapToString(map);
- }
- private static String mapToString(Map<Character,Integer> map){
- StringBuilder sb = new StringBuilder();
- Iterator<Character> it = map.keySet().iterator();
- while(it.hasNext()){
- Character key = it.next();
- Integer value = map.get(key);
- sb.append(key + "(" + value + ")" );
- }
- return sb.toString();
- }
- }
复制代码 运行结果:
Map在有映射关系时,可以优先考虑,在查表法中的应用较为多见。
示例:
- import java.util.HashMap;
- import java.util.Map;
-
- public class MapTest{
- public static void main(String[] args){
- String week = getWeek(1);
- System.out.println(week);
- System.out.println(getWeekByMap(week));
- }
- public static String getWeekByMap(String week){
- Map<String,String> map = new HashMap<String,String>();
-
- map.put( "星期一","Mon" );
- map.put( "星期二","Tue" );
- map.put( "星期三","Wes" );
- map.put( "星期日","Sun" );
- map.put( "星期天","Sun" );
-
- return map.get(week);
- }
- public static String getWeek(int week){
- if(week<1 || week>7)
- throw new RuntimeException("没有对应的星期,请您重新输入" );
- String[] weeks = { "","星期一" ,"星期二" };
-
- return weeks[week];
- }
- }
复制代码 运行结果:
6.2.6 Collections工具类
Collections:是集合框架的工具类,里面的方法都是静态的。
示例1:
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.List;
- public class CollectionsDemo{
- public static void main(String[] args){
- demo1();
- }
- public static void demo1(){
- List<String> list = new ArrayList<String>();
- list.add( "abcde");
- list.add( "cba");
- list.add( "aa");
- list.add( "zzz");
- list.add( "cba");
- list.add( "nbaa");
- //对list集合进行指定顺序的排序
- Collections. sort(list);
- System. out.println(list);
- Collections. sort(list,new ComparatorByLength());
- System. out.println(list);
-
- mySort(list,new ComparatorByLength());
- System. out.println(list);
- }
- public static <T> void mySort(List<T> list,Comparator<? super T> comp){
- for(int i = 0; i < list.size() - 1; i++){
- for(int j = i + 1; j < list.size(); j++){
- if(comp.compare(list.get(i),list.get(j))>0){
- Collections. swap(list ,i,j);
- }
- }
- }
- }
- }
- class ComparatorByLength implements Comparator<String>{
- public int compare(String o1,String o2){
- int temp = o1.length() - o2.length();
- return temp == 0?o1.compareTo(o2):temp;
- }
- }
复制代码 运行结果:
示例2:
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.List;
- public class CollectionsDemo{
- public static void main(String[] args){
- demo2();
- }
- public static void demo2(){
- List<String> list = new ArrayList<String>();
- list.add( "abcde");
- list.add( "cba");
- list.add( "aa");
- list.add( "zzz");
- list.add( "cba");
- list.add( "nbaa");
-
- Collections.sort(list);
- System.out.println(list);
- int index = Collections.binarySearch(list,"aaa");
- System.out.println( "index = " + index);//-2 -index-1
- //获取最大值
- String max = Collections.max(list, new ComparatorByLength());
- System.out.println( "max = " + max);
- }
- }
- class ComparatorByLength implements Comparator<String>{
- public int compare(String o1,String o2){
- int temp = o1.length() - o2.length();
- return temp == 0?o1.compareTo(o2):temp;
- }
- }
复制代码 运行结果:
原因分析:
示例3: - import java.util.Collections;
- import java.util.Comparator;
- import java.util.TreeSet;
- public class CollectionsDemo{
- public static void main(String[] args){
- demo3();
- }
- public static void demo3(){
- TreeSet<String> ts = new TreeSet<String>(Collections.reverseOrder());
- ts = new TreeSet<String>(Collections.reverseOrder(new ComparatorByLength()));
- ts.add( "abc");
- ts.add( "hahaha");
- ts.add( "zzz");
- ts.add( "aa");
- ts.add( "cba");
- System.out.println(ts);
- }
- }
- class ComparatorByLength implements Comparator<String>{
- public int compare(String o1,String o2){
- int temp = o1.length() - o2.length();
- return temp == 0?o1.compareTo(o2):temp;
- }
- }
复制代码 运行结果: 示例4:- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- public class CollectionsDemo{
- public static void main(String[] args){
- demo4();
- }
- public static void demo4(){
- List<String> list = new ArrayList<String>();
- list.add( "abcde");
- list.add( "cba");
- list.add( "aa");
- System. out.println(list);
- Collections. replaceAll(list,"cba", "nba");
- System. out.println(list);
- }
- }
复制代码 运行结果:
示例5:
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- public class CollectionsDemo{
- public static void main(String[] args){
- demo5();
- }
- public static void demo5(){
- List<String> list = new ArrayList<String>();
- list.add( "abcde");
- list.add( "cba");
- list.add( "zhangsan");
- list.add( "zhaoliu");
- list.add( "xiaoqiang");
- System. out.println(list);
- Collections. shuffle(list);
- System. out.println(list);
- }
- }
复制代码 运行结果:
原因分析:
练习:
给非同步的集合加锁。
代码:
- import java.util.ArrayList;
- import java.util.List;
- class MyCollections{
- public List synList(List list){
- return new MyList(list);
- }
- private class MyList extends ArrayList{
- private List list;
- private final Object lock = new Object();
- MyList(List list){
- this.list = list;
- }
-
- public boolean add(Object obj){
- synchronized(lock){
- return list.add(obj);
- }
- }
-
- public boolean remove(Object obj){
- synchronized(lock){
- return list.remove(obj);
- }
- }
- }
- }
- class Test{
- public static void main(String[] args) {
- List list = new ArrayList();//非同步的
- list = new MyCollections().synList(list);//同步的
- }
- }
复制代码
6.2.7 Arrays工具类 Arrays:集合框架的工具类,里面的方法都是静态的。
示例1:
- import java.util.Arrays;
- class ArraysDemo{
- public static void main(String[] args){
- int[] arr = {3,1,5,6,4,7};
- System.out.println(Arrays.toString(arr));
- }
- }
复制代码 运行结果:
重点:List asList(数组)将数组转成集合。 好处:可以使用集合的方法操作数组。
示例2:
- import java.util.Arrays;
- import java.util.List;
- class ArraysDemo{
- public static void main(String[] args){
- String[] arr = { "abc","haha" ,"xixi" };
-
- List<String> list = Arrays. asList(arr);
- boolean b = list.contains("xixi" );
- System. out.println(b);
- }
- }
复制代码 运行结果:
P.S.
数组的长度是固定的,所以对于结合的增删方法是不可以使用的,否则,会发生UnsupportedOperationException。
数组转集合,用asList方法。
如果数组中的元素是对象,那么转成集合时,直接将数组中的元素作为集合中的元素进行集合存储。
如果数组中的元素是基本类型数值,那么会将该数组作为集合中的元素进行存储。
示例3: - import java.util.Arrays;
- import java.util.List;
- class ArraysDemo{
- public static void main(String[] args){
- int[] arr1 = {31,11,51,61};
- List< int[]> list1 = Arrays.asList(arr1);
- System.out.println(list1);
- Integer[] arr2 = {31,11,51,61};
- List list2 = Arrays.asList(arr2);
- System.out.println(list2);
- }
- }
复制代码 运行结果:
使用的就是Collection接口中的toArray方法。
集合转成数组,可以对集合中的元素操作的方法进行限定,不允许对其进行增删。
toArray方法需要传入一个指定类型的数组。
长度该如何定义呢?
如果长度小于集合的size,那么该方法会创建一个同类型并和集合相同的size的数组。
如果长度大于集合的size,那么该方法就会使用指定的数组,存储集合中的元素,其他位置默认为null。
所以建议,最后长度就指定为,集合的size。
示例4:
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
- public class ToArray{
- public static void main(String[] args){
- List<String> list = new ArrayList<String>();
- list.add( "abc1");
- list.add( "abc2");
- list.add( "abc3");
- String[] arr = list.toArray( new String[2]);
-
- System.out.println(Arrays.toString(arr));
- }
- }
复制代码 运行结果:
~END~
|