集合

 1 //java基础视频教程第16天-01-集合(Map概述)
 2 /*
 3     Map
 4         |--Hashtable
 5         |--HashMap
 6         |--TreeMap
 7 
 8     Map:方法
 9         增添
10             put(K key,V value)
11             putAll(Map<? extends K,? extends V> m)
12         删除
13         clear()
14         remove()
15         判断
16         isEmpty()
17         containsValue(Object value)
18         containsKey(Object key)
19         获取
20         get(Object key)
21         size()
22         values()
23 
24         entrySet()
25         keyeSet()
26 */
 1 //java基础视频教程第16天-02-集合(Map子类对象特点)
 2 /*
 3     Map:
 4         |--Hashtable:底层是哈希表数据结构,不可以存入null键null值,该集合是线程同步的,JDK1.0,效率底
 5         |--HashMap:底层是哈希表数据结构,允许使用null值和null键,该集合是不同步的,JDK1.2,效率高
 6         |--TreeMap:底层是二叉树数据结构,线程不同步,可以用于给map集合中的键进行排序
 7 
 8 Map和Set很想
 9 其实Set底层就是使用了Map集合
10 */
 1 //java基础视频第16天-03-集合(Map共性方法)
 2 import java.util.*;
 3 class MapDemo2 
 4 {
 5     public static void main(String[] args) 
 6     {
 7         Map<String,String> map = new HashMap<String,String>();
 8         //
 9         sop(map.put("1","abc1"));    //返回null,
10         sop(map.put("1","abc4"));    //当键相同的时候,新的值会替代旧的值,并返回旧的值
11         map.put("2","abc2");
12         map.put("3","abc3");
13         map.put(null,null);        //null可以为HashSet的键值对
14         //打印
15         sop(map);
16         //
17         sop(map.get("1"));
18         sop(map.get("22"));        //如果没有这个键,则返回null
19         //
20         sop(map.remove("2"));    //如果存在这个键的值,删除之后返回删除的值
21         sop(map.remove("22"));    //如果不存在这个键的值,则返回null
22         //
23         sop(map.isEmpty());
24         sop(map.containsValue("abc3"));
25         sop(map.containsKey(null));
26 
27         //打印出value值
28             Collection<String> coll = map.values();        //values()返回来的值是一个集合Collection
29             sop(coll);
30 
31     }
32     public static void sop(Object o)
33     {
34     System.out.println(o);
35     }
36 }
 1 //java基础视频教程第16天-04-集合(Map-keySet)
 2 /*
 3     第一种方法:
 4     通过keySet打印出HashMap中的键值对
 5 */
 6 import java.util.*;
 7 class MapDemo3
 8 {
 9     public static void main(String[] args) 
10     {
11         Map<String,String> map = new HashMap<String,String>();
12         map.put("1","abc1");
13         map.put("2","abc2");
14         map.put("3","abc3");
15         map.put("4","abc4");
16         map.put("5","abc5");
17         Set<String> keyset = map.keySet();        //keySet()返回的是set的集合,集合中都是key的
18         Iterator<String> i = keyset.iterator();    //通过Set中的迭代器取出键元素,然后通过get(key)获取值
19         while(i.hasNext())
20         {
21             String s = i.next();
22             sop(s+"->"+map.get(s));
23         }
24     }
25     public static void sop(Object o)
26     {
27         System.out.println(o);
28     }
29 }
 1 //java基础视频教程第16天-05-集合(Map-entrySet)
 2 import java.util.*;
 3 class MapDemo4
 4 {
 5     public static void main(String[] args) 
 6     {
 7         Map<String,String> map = new HashMap<String,String>();
 8         map.put("1","abc1");
 9         map.put("2","abc2");
10         map.put("3","abc3");
11         map.put("4","abc4");
12         map.put("5","abc5");
13         Set<Map.Entry<String,String>> s= map.entrySet();            //entrySet()返回的是映射关系类型,相当于结婚证,把映射关系存入Set集合中
14         Iterator<Map.Entry<String,String>> i = s.iterator();        //然后用Set集合中的迭代器遍历出映射类型
15         while(i.hasNext())
16         {
17             Map.Entry<String,String> m = i.next();        //映射类型
18             sop(m.getKey()+":"+m.getValue());            //映射关系也有自己的方法取出key和value
19         }
20 
21     }
22     public static void sop(Object o)
23     {
24         System.out.println(o);
25     }
26 }
27 /*
28     Map.Entry其实Entry也是一个接口,它是Map接口中的一个内部接口
29     如下:
30 
31 interface Map
32 {
33     public static interface Entry            //能在接口上加static表示这个接口是成员位置上
34     {
35         public abstract Object getKey();
36         public abstract Object getValue();
37     }
38 }
39 class HashMap implements Map
40 {
41     class Hahs implements Map.Entry
42     {
43         public Object getKey(){}
44         public Object getValu(){}
45     }
46 }
47 
48 */
 1 //java基础视频教程第16天-06-集合(Map练习)
 2 /*
 3     用HashMap存Person对象
 4     学生属性:姓名,年龄
 5     注意:姓名和年龄相同视为同一个学生
 6     保证学生的唯一性
 7 
 8     1.描述学生
 9     2.定义map容器,将学生作为键,地址作为值,存入
10     3.两种方式获取map集合中的元素
11 */
12 import java.util.*;
13 class Person implements Comparable<Person>                //当集合中要创建多个这样的对象时,放在那个集合不确定,所以实现Comparable和重写hashCode和equals
14 {
15     private String name;
16     private int age;
17     Person(String name , int age)
18     {
19         this.name = name;
20         this.age = age;
21     }
22     public int compareTo(Person p)
23     {
24         int num = new Integer(this.age).compareTo(new Integer(p.age));
25         if(num==0)
26             return this.name.compareTo(p.name);
27         return num;
28     }
29     public int hashCode()
30     {
31             return this.name.hashCode()+this.age*34;    
32     }
33     public boolean equals(Object o)                //此处的equals不能用泛型,因为它是继承与Object,没有泛型
34     {
35         if(!(o instanceof Person))
36             throw new ClassCastException("传入的值不是Person类型");
37         Person p = (Person)o;
38         return this.name.equals(p.name) && this.age == p.age;
39 
40     }
41     public String getName()
42     {
43         return name;
44     }
45     public int getAge()
46     {
47         return age;
48     }
49     public String toString()
50     {
51         return(name+":"+age);
52     }
53 }
54 class MapTest 
55 {
56     public static void main(String[] args) 
57     {
58         HashMap<Person,String> h = new HashMap<Person,String>();
59         h.put(new Person("abc1",19),"beijing");
60         h.put(new Person("abc1",19),"sichuan");        //当键key相同时,会替换前者
61         h.put(new Person("abc2",20),"tianjing");
62         h.put(new Person("abc3",21),"nanjing");
63         //第一种方法
64         Set<Person> s = h.keySet();
65         Iterator<Person> i = s.iterator();
66         while(i.hasNext())
67         {
68             Person p = i.next();
69             sop(p.getName()+":"+p.getAge()+":"+h.get(p));
70         }
71         //第二种方法
72         Set<Map.Entry<Person,String>> st = h.entrySet();
73         Iterator<Map.Entry<Person,String>> it = st.iterator();
74         while(it.hasNext())
75         {
76             Map.Entry<Person,String> m = it.next();
77             sop(m.getKey()+"---"+m.getValue());
78         }
79 
80     }
81     public static void sop(Object o)
82     {
83         System.out.println(o);
84     }
85 }
 1 //java基础视频教程第16天-07-集合(ThreeMap练习)
 2 /*
 3     需求:对人对象的年龄进行升序排序
 4 
 5     因为数据时以键值对形式存在的
 6     所以套使用可以排序的Map集合。TreeMap
 7 */
 8 //会自动载入上一张的person.class
 9 import java.util.*;
10 class MapTest2
11 {
12     public static void main(String[] args) 
13     {
14         TreeMap<Person,String> t = new TreeMap<Person,String>(new Comp());
15         t.put(new Person("abc2",22),"tianjing");
16         t.put(new Person("abc1",21),"beijing");
17         t.put(new Person("abc3",23),"shanghai");
18         t.put(new Person("abc3",23),"wuhan");        //当Key一样的时候,后面的值覆盖前面的值
19         t.put(new Person("abc4",24),"sichuan");
20         Set<Map.Entry<Person,String>> s = t.entrySet();
21         Iterator<Map.Entry<Person,String>> i = s.iterator();
22         while(i.hasNext())
23         {
24             Map.Entry<Person,String> m = i.next();
25             sop(m.getKey()+":"+m.getValue());
26         }
27     }
28     public static void sop(Object o)
29     {
30         System.out.println(o);
31     }
32 }
33 class Comp implements Comparator<Person>
34 {
35     public int compare(Person p1,Person p2)
36     {
37         int num = p1.getName().compareTo(p2.getName());
38         if(num==0)
39         {
40             return new Integer(p1.getAge()).compareTo(new Integer(p2.getAge()));
41         }
42         return num;
43     }
44 }
 1 //java基础视频教程第16天-08-集合(TreeMap练习-字母出现的次数)
 2 /*
 3     练习:
 4     "sdfgzxcvasdfxcvdf"获取该字符串的字母出现的次数
 5     打印如此结果:a(1)c(2)
 6 
 7     思路:
 8     1.首先把字符串变成数组
 9     2.然后把数组中的每个字符作为Key去查询TreeMap()集合中是否有这个值,如果没有就会返回null,则把这个key加入到TreeMap(),并给它存一个value1,如果集合中有这个值,则累积他的value值
10     3.最后是打印出这个集合
11 */
12 import java.util.*;
13 class MapTest3
14 {
15     public static void main(String[] args) 
16     {
17         sop(getChar("sdfgzxf.c.va,?sd/fxcvdf"));
18     }
19     public static void sop(Object o)
20     {
21         System.out.println(o);
22     }
23     
24     public static String getChar(String s)
25     {
26         
27         char[] arr = s.toCharArray();
28         TreeMap<Character,Integer> t = new TreeMap<Character,Integer>();            //集合中泛型只能是引用数据类型
29         int count = 0;                        //count定义在for外面只开辟一次空间
30         for (int x=0;x<arr.length;x++)        //分析:我拿遍历出来的字符作为key去到TreeMap集合中去查询有没有这个键,没有就把这个键加入到集合中去,并把value初始化为1,如果有这个键则返回来是它对应的value值,value值就是代表多个这个字符
31         {
32             //int count = 0;                        //count定义在for循环里面,每次循环都会在栈内存中开辟空间,然后释放空间    
33             if(!(arr[x]>='a' && arr[x]<='z' || arr[x]>='A' && arr[x]<='Z'))            //不是a-z或者A-Z都就继续循环
34                 continue;
35             Integer value = t.get(arr[x]);        //集合当中都是装的对象,所以这里的value类型是Integer而非int
36             
37             if(value!=null)
38                 count = value;                    //count是int类型,value是Integer类型,能够赋值吗????????
39                 count++;                            
40             t.put(arr[x],count);                //由于key值是Character,它实现了Comparable,具有比较性,所以存入的时候就有默认的自然排序
41                 count =0;                        //如果把count定义在for外面每次循环完要清零
42             
43             /*
44             if(value==null)                        //注释的这部分是第一种方法塞选出t,上面那种方法更简洁
45                 t.put(arr[x],1);
46             else
47                 t.put(arr[x],value+1);            
48             */
49         }
50         sop(t);
51         Set<Map.Entry<Character,Integer>> st = t.entrySet();            //entrySet返回的是映射关系类型,用Set集合存放映射关系类型
52         Iterator<Map.Entry<Character,Integer>> it = st.iterator();        //然后用Set中的迭代器跌倒出关系类型
53         StringBuilder sb = new StringBuilder();
54         while(it.hasNext())
55         {
56             Map.Entry<Character,Integer> m = it.next();                //映射关系类型有自己取出key和value的方法
57             sb.append(m.getKey()+"(").append(m.getValue()+")");        //可以改成sb.append(m.getKey()+"("+m.getValue()+")");
58         }
59         
60         return sb.toString();
61     }
62 }
 1 //java基础教程第16天-09-集合(Map扩展)
 2 import java.util.*;
 3 class Student
 4 {
 5     private String id;
 6     private String name;
 7     Student(String id,String name)
 8     {
 9         this.id = id;
10         this.name = name;
11     }
12     public String getId()
13     {
14         return id;
15     }
16     public String getName()
17     {
18         return name;
19     }
20 }
21 class MapDemo6
22 {
23     public static void main(String[] args) 
24     {
25         HashMap<String,ArrayList<Student>> czbk = new HashMap<String,ArrayList<Student>>();            //List是抽象的,无法实例化
26         ArrayList<Student> yure = new ArrayList<Student>();            //第二步还有些写不来
27         ArrayList<Student> jiuye = new ArrayList<Student>();
28         czbk.put("yure",yure);
29         czbk.put("jiuye",jiuye);
30         yure.add(new Student("01","wangxiaoming"));
31         yure.add(new Student("02","zhangmuzi"));
32         jiuye.add(new Student("01","wangxiaogang"));
33         jiuye.add(new Student("02","haohaogan"));
34         
35         /*
36         //非方法打印
37         Iterator<String> i = czbk.keySet().iterator();
38         while(i.hasNext())
39         {
40             String s = i.next();
41             ArrayList<Student> l = czbk.get(s);
42             Iterator<Student> it = l.iterator();
43             while(it.hasNext())
44             {
45                 Student st = it.next();
46                 sop(st.getId()+"---"+st.getName());
47             }
48         }
49         */
50 
51     getValue(czbk);            //此处也可以先遍历出班级,然后用方法遍历出id和name
52     }
53     public static void getValue(HashMap<String,ArrayList<Student>> czbk)
54     {
55         Iterator<String> i = czbk.keySet().iterator();
56         while(i.hasNext())
57         {
58             String s = i.next();
59             ArrayList<Student> l = czbk.get(s);
60             Iterator<Student> it = l.iterator();
61             while(it.hasNext())
62             {
63                 Student st = it.next();
64                 sop(st.getId()+"---"+st.getName());
65             }
66         }
67     }
68     public static void sop(Object o)
69     {
70         System.out.println(o);
71     }
72 
73     
74 }
 1 //java基础教程第16天-09-集合(Map扩展)
 2 import java.util.*;
 3 class MapDemo5 
 4 {
 5     public static void main(String[] args) 
 6     {
 7         
 8         HashMap<String,String> yure  = new HashMap<String,String>();
 9         yure.put("01","zhangdadan");
10         yure.put("02","maxiaoji");
11         HashMap<String,String> jiuye = new HashMap<String,String>();
12         jiuye.put("02","shahaha");
13         jiuye.put("01","liuxiaoqi");
14         HashMap<String,HashMap<String,String>> czbk = new HashMap<String,HashMap<String,String>>();        //为什么要用HashMap,不用其它的,因为是这是映射     //注意大的嵌套放在后面,不然读不到小圈里面的
15         czbk.put("yure",yure);            //注意嵌套关系
16         czbk.put("jiuye",jiuye);
17         
18 
19         /*
20         //非方法打印出嵌套的值
21         Iterator<String> i = czbk.keySet().iterator();  //注意keySet()的大小写
22         while(i.hasNext())
23         {
24             String key = i.next();
25             HashMap<String,String> value = czbk.get(key);  
26                 Iterator<String> it = value.keySet().iterator();
27 
28             while(it.hasNext())
29             {
30                 String id = it.next();
31                 sop(id +"---"+value.get(id));
32             }
33         }
34         */
35         getValue(czbk);                    //此处也可以先遍历出班级,然后用方法遍历出id和name
36     }
37     //通过方法打印出嵌套的值
38     public static void getValue(HashMap<String,HashMap<String,String>> shool)        //方法中传的参数泛型要注意,
39     {
40         Iterator<String> i = shool.keySet().iterator(); 
41         while(i.hasNext())
42         {
43             String key = i.next();
44             HashMap<String,String> value = shool.get(key);  
45                 Iterator<String> it = value.keySet().iterator();
46 
47             while(it.hasNext())
48             {
49                 String id = it.next();
50                 sop(id +"---"+value.get(id));
51             }
52         }
53     }
54     
55     public static void sop(Object o)
56     {
57         System.out.println(o);
58     }
59     
60 }

 

 1 //java基础视频教程第17天-11-集合(Collections-max)
 2 /*
 3     集合框架的工具类,Collections用于对List集合的排序
 4     public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
 5     public static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp)    //传入自己写的比较器
 6 */
 7 import java.util.*;
 8 class CollectionsDemo
 9 {
10     public static void main(String[] args) 
11     {
12         getSort();
13     }
14     public static void getSort()
15     {
16         List<String> l = new ArrayList<String>();
17         l.add("cc");
18         l.add("xxxxxx");
19         l.add("cc");        //由于是数组结构,所以可以允许元素重复,因为有索引
20         l.add("ddd");
21         l.add("zzzzz");
22         l.add("a");
23         sop(l);
24         Collections.sort(l);                //按照自然顺序排集合
25         sop(l);
26         Collections.sort(l,new Comp());            //传入比较器,通过长度排序
27         sop(l);
28         String max = Collections.max(l);        //去最大值,比较的是字符的asicc码
29         sop(max);
30         String maxLenth = Collections.max(l,new Comp());        //传入一个长度比较器,按照长度比较
31         sop(maxLenth);
32     }
33     public static void sop(Object o)
34     {
35         System.out.println(o);
36     }
37 }
38 class Comp implements Comparator<String>        
39 {
40     public int compare(String s1,String s2)        //要想这里不在是Object,就需要泛型
41     {
42         if(s1.length()>s2.length())
43             return 1;
44         if(s1.length()<s2.length())
45             return -1;
46         return s1.compareTo(s2);
47     }
48 }

 

 1 //java基础视频教程第17天-10-集合(collection-sort)
 2 /*
 3     CollectionsDemo是用于操作集合的工具类
 4     它的方法都是静态的,其中一个sort可以对List集合排序,因为List里面没有直接排序的方法
 5     public static <T extends Comparable<? super T>> void sort(List<T> list),自然排序,传入过来的参数必须具备比较性,所以才继承Comparable,而Comparable又有自己的泛型,所以加上<? super T>
 6 
 7     public static <T> void sort(List<T> list, Comparator<? super T> c) ,通过传递一个比较器,就可以不用原来的自然排序功能了
 8 */
 9 import java.util.*;
10 class CollectionsDemo
11 {
12     public static void main(String[] args) 
13     {
14         List<String> l = new ArrayList<String>();
15         l.add("cc");
16         l.add("xxxx");
17         l.add("cc");        //由于是数组结构,所以可以允许元素重复,因为有索引
18         l.add("ddd");
19         l.add("zzzzz");
20         l.add("a");
21         sop(l);
22         Collections.sort(l);
23         sop(l);
24         Collections.sort(l,new Comp());            //传入比较器,通过长度排序
25         sop(l);
26     }
27     public static void sop(Object o)
28     {
29         System.out.println(o);
30     }
31 }
32 class Comp implements Comparator<String>        
33 {
34     public int compare(String s1,String s2)        //要想这里不在是Object,就需要泛型
35     {
36         if(s1.length()>s2.length())
37             return -1;
38         if(s1.length()<s2.length())
39             return 1;
40         return s1.compareTo(s2);
41     }
42 }
 1 //java基础视频教程第17天-12-集合(Collections-binarySearch)
 2 /*
 3     public static <T> int binarySearch(List<? extends Comparable<? super T>> list,T key)
 4     public static <T> int binarySearch(List<? extends T> list,T key,Comparator<? super T> c)
 5     用来查找有序集合中的特定对象的
 6 */
 7 import java.util.*;
 8 class CollectionsDemo2 
 9 {
10     public static void main(String[] args) 
11     {
12         List<String> it = new ArrayList<String>();
13         it.add("aaaaa");
14         it.add("cccc");
15         it.add("ddd");
16         it.add("ee");
17         it.add("f");
18         Collections.sort(it);
19         sop(it);
20         int index = Collections.binarySearch(it,"aaaaa");        //查找指定的字符,查找前对集合进行升序排序,如果元素存在则返回元素的下角标
21         sop(index);
22         
23         int index1 = Collections.binarySearch(it,"g");    //如果查找的元素没有,则会返回(-插入点-1)返回-7,那么ee就该排在第6个的位置上[aaaa, aaa, bbb, cc, dd, e]
24         sop(index1);
25         Collections.sort(it,new Comp());
26         sop(it);
27         int index2 = Collections.binarySearch(it,"ss",new Comp());    //按照传入的比较器比较长度排序,ss应该排在第三位,所以返回的是(-3-1),
28         sop(index2);
29         
30         int num = halfSearch(it,"g");
31         sop(num);
32         int num1 = halfSearch1(it,"f",new Comp());
33         sop(num1);
34     }
35     public static int halfSearch(List<String> it,String key)        //二分查找
36     {
37         int min=0,max=it.size()-1,mid;        //分析:二分查找是通过要查找的key与中间值比较,当key比中间值mid大那么min就向右移min=mid+1,如果
38         while(max>=min)                                    //key比中间值小那么max就向左移max=mid-1,如果key与中间值相等,表示key与中间值相同,就返回key的位置
39         {                                                //以上的前提条件是max>=min
40             mid =(min+max)>>1;                    //相当于除2
41             int num = key.compareTo(it.get(mid));            //此处比较的是字符码的大小
42             if(num>0)
43                 min = mid+1;                            //min=0,max = 4,mid =2,it.get(2)="ddd",ee.conpareTo(ddd)<1,max=1
44             else if(num<0)
45                 max = mid-1;
46             else
47             return mid;
48 
49         }                                                
50         return min/*-min-1*/;        //如果返回为-min-1则就相当于binarySearch
51     }
52     public static int halfSearch1(List<String> it,String key,Comparator<String> comp)    //按照长度查询    //相当于在binarySearch中插入自定义比较器
53     {
54         int min=0,max=it.size()-1,mid;        
55         while(max>=min)                                
56         {                                                
57             mid =(min+max)>>1;                    
58             int num = comp.compare(key,it.get(mid));            //关于这点仔细研究下
59             if(num>0)
60                 min = mid+1;                            
61             else if(num<0)
62                 max = mid-1;
63             else
64             return mid;
65 
66         }                                                
67         return min/*-min-1*/;        
68     }
69     public static void sop(Object o)
70     {
71         System.out.println(o);
72     }
73 }
74 class Comp implements Comparator<String>
75 {
76     public int compare(String s1,String s2)
77     {
78         if(s1.length()>s2.length())
79             return 1;
80         if(s1.length()<s2.length())
81             return -1;
82         return s1.compareTo(s2);
83     }
84 }
 1 //java基础视频教程17天-13-集合(Collection-替换反转)
 2 /*
 3 public static <T> void fill(List<? super T> list, T obj)
 4 public static <T> boolean replaceAll(List<T> list, T oldVal, T newVal)
 5 public static void reverse(List<?> list)
 6 */
 7 import java.util.*;
 8 class CollectionsDemo3
 9 {
10     public static void main(String[] args) 
11     {
12         List<String> it = new ArrayList<String>();
13         it.add("aaaaa");
14         it.add("cccc");
15         it.add("ddd");
16         it.add("ee");
17         it.add("f");
18         //Collections.fill(it,"qy");    //将集合中的元素全部替换为指定的对象
19         
20         sop(it);
21         Collections.replaceAll(it,"f","x");        //f是旧值,x是新值,其实这个方法就相当于List中的set(get(g),x)
22         sop(it);
23         sop(fillDemo(it,"cccc","ee"));            
24         Collections.reverse(it);                //反转List集合
25         sop(it);
26     }
27         /*
28             练习:fill方法可以将list集合中的元素替换为指定的元素,现在要求将list集合中部分袁术替换为指定的元素
29             分析:fill可以将List集合中的元素都替换成指定的元素,现在我要求将List集合中部分元素替换成指定元素,那么必须由其实位置start和结束位置end
30             如何取出,start到end位置之间的元素呢,比如我现在要替换cccc到ee之间的元素
31         */
32 
33     public static List<String> fillDemo(List<String> it ,String start,String end)
34     {
35         int x =it.indexOf(start);
36         int y =it.indexOf(end);
37         List<String> i=it.subList(x,y+1);        //subList()方法取头不娶尾,所以y要加1
38         Collections.fill(i,"qy");
39             return it;
40     }
41     public static void sop(Object o)
42     {
43         System.out.println(o);
44     }
45 }
 1 //java基础视频教程第17天-14-集合(Collection-reverseOrder)
 2 /*
 3     public static <T> Comparator<T> reverseOrder()        //返回的是比较器,这个比较器可以强行逆转集合中元素的自然排序
 4     public static <T> Comparator<T> reverseOrder(Comparator<T> cmp)        //返回还是比较器,这个比较器可以把传入的比较器反转
 5 */
 6 import java.util.*;
 7 class CollectionsDemo4
 8 {
 9     public static void main(String[] args) 
10     {
11         TreeSet<String> it = new TreeSet<String>(Collections.reverseOrder(new LenthComp()));    //强制反转长度比较器。    
12         it.add("aaaaa");
13         it.add("ddd");
14         it.add("cccc");
15         it.add("ee");
16         it.add("me");
17         it.add("f");
18         sop(it);
19     }
20     public static void sop(Object o)
21     {
22         System.out.println(o);
23     }
24 }
25 /*
26 相当于Collections.reverseOrder() 反序排序
27 class StrComp implements Comparator<String>
28 {
29     public int compare(String s1,String s2)
30     {
31         return s2.compareTo(s1);            
32     }
33 }
34 */
35 class LenthComp implements Comparator<String>        
36 {
37     public int compare(String s1,String s2)
38     {
39         int num =  new Integer(s1.length()).compareTo(new Integer(s2.length()));    //要把int转换成Integer才能用Integer的方法compareTo        
40         if(num ==0)
41         return s1.compareTo(s2);
42         return num;
43     }
44 }
 1 //java基础视频教程第17天-15-集合(Collection-SynList)
 2 /*
 3     这章主要讲解synchronized的一系列方法,它可以将非同步的系列集合转换成同步的结合
 4     public static <T> Collection<T> synchronizedCollection(Collection<T> c)
 5     public static <T> List<T> synchronizedList(List<T> list) 
 6     public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
 7     public static <T> Set<T> synchronizedSet(Set<T> s)
 8     然后就是
 9     public static void reverse(List<?> list)    //反转有序的列表集合,记住是有序的
10     public static void swap(List<?> list,int i,int j)    //置换列表集合集合中任意两个元素的位置
11     public static void shuffle(List<?> list)        //随机的置换列表中的元素位置,比如用于洗牌,初始化骰子什么的
12 */
13 import java.util.*;
14 class CollectionsDemo5
15 {
16     public static void main(String[] args) 
17     {
18         List<String> it = new ArrayList<String>();
19         it.add("abcde");
20         it.add("bcd");
21         it.add("cd");
22         it.add("d");
23         sop(it);
24         Collections.reverse(it);
25         sop(it);
26         Collections.swap(it,1,2);            //置换的只是位置,所以这里的swap()只能用于置换有序列表
27         sop(it);
28         Collections.shuffle(it);
29         sop(it);
30 
31     }
32     public static void sop(Object o)
33     {
34         System.out.println(o);
35     }
36 }
 1 //java基础视频教程第17天-16-集合(Arrays)
 2 /*
 3     本课主要讲了Arrays中的方法,这个类主要操作数组方法如下
 4     binarySearch,二分查找数组中的元素,大概有三种形式,分别是查找指定的key,查找指点范围的key,以及传入比较器查找key
 5     copyOf,复制指定长度的数组
 6     copyOfRange,复制指定的长度的元素组成一个新的数组,从那到那,不包含尾
 7     deepEquals,深度比较
 8     equals,比较
 9     fill,替换数组中个值,也可以替换指定范围的值
10     hashCode
11     sort,排序,还可以让指定范围排序
12     toString,将数组变为字符串
13 
14     最特别的方法
15     asList():将数组变成list集合
16     注意:对于把数组转换成集合的好处是便于用集合的方法区操作数组的元素,但是却不能用增删方法操作
17 
18 
19 */
20 import java.util.*;            //不要忘记Arrays也是util包中的类
21 class ArraysDemo
22 {
23     public static void main(String[] args) 
24     {
25         int[] arr = {1,2,3,4,5};
26         String s =Arrays.toString(arr);                //将数组转换成字符串
27         sop(s);
28         asList();
29     }
30     public static void sop(Object o)
31     {
32         System.out.println(o);
33     }
34     public static void asList()
35     {
36         int[] arr = {1,2,3,4,5};
37         Integer[] num = {1,2,3,4,5};
38         List<int[]> l = Arrays.asList(arr);        //当数组类型是基本数据类型时,则只会把这个数组作为一个元素存入List集合中,类型为int[],打印的只是一个元素的哈希值
39         List<Integer> i = Arrays.asList(num);    //当数组类型不是基本数据类型时,则会把数组中的每个元素存到List集合中,打印出集合中的每个元素
40         sop(l);
41         sop(i);
42         String[] s = {"aa","ba","ca","ea"};
43         List<String> list= Arrays.asList(s);
44         //t.add("d");                        //对于转换成的列表不能添加和删除数据,否则运行时出异常UnsupportedOperationException
45         //t.remove(2);
46         sop(list);
47         sop("contains:"+list.contains("ca"));        //list里面没有contains方法,用的是Arraylist中的方法,所以,父类调用子类方法用的就是子类的
48         sop(searchKey(s,"e"));                        //相当于contains
49     }
50     public static boolean searchKey(String[] arr,String key)        
51     {
52         for (int x=0;x<arr.length;x++)
53         {
54             if(arr[x].equals(key))
55                 return true;
56         }
57         return false;
58     }
59 }
 1 //java基础视频教程第17天-17-集合(集合转成数组)
 2 /*
 3     本课主要讲解了Collection中的toArray()方法,将集合变成数组
 4     将集合变成数组时为了禁止对集合进行增删,禁止操作集合中的元素
 5     <T> T[] toArray(T[] a)        //传递的数组要多长,最好就是集合的长度
 6     Object[] toArray()
 7 */
 8 import java.util.*;
 9 class CollectionToArray 
10 {
11     public static void main(String[] args) 
12     {
13         
14         ArrayList<String> al = new ArrayList<String>();
15         al.add("abc");
16         al.add("cde");
17         al.add("bcd");
18         al.add("def");
19         sop(al);
20         String[] s = al.toArray(new String[1]);  //传递一个个数小于集合元素的个数的数组时,则系统会自动建立一个集合元素个数的数组装下这些元素
21         sop(Arrays.toString(s));
22         String[] r = al.toArray(new String[6]);     //当传递一个个数大于集合元素个数的数组时,过多的个数会用null代替
23         sop(Arrays.toString(r));    
24         String[] arr = al.toArray(new String[al.size()]);        //传递一个个数等于集合中元素个数的数组恰恰好
25         sop(Arrays.toString(arr));                //Arrays.toString(arr)上一章才学的,这就忘记用了,用少了,凡是数组就应该想到Arrays里面的方法
26     }
27     public static void sop(Object o)
28     {
29         System.out.println(o);
30     }
31 }
 1 //java基础视频教程第17天-18-集合(增强for循环)
 2 /*
 3     本节课主要学习了高级for循环,以及高级for循环和迭代器的区别,还有高级for循环和传统for循环的区别,以及map中如何运用高级for循环
 4     高级for循环是迭代器的建议替代,它来自于Collection的爹Iterable(可迭代)框架提供的foreach功能
 5 
 6     高级for循环格式
 7     for(泛型类型 变量名:要遍历的Collection集合或数组)
 8         打印出变量名
 9 
10     高级for循环只能对集合进行遍历获取,但是不能对集合进行操作
11     而迭代器可以对集合中的元素进行remove,另外ListIterator中的可以对集合中的元素进行很多操作
12     高级for循环与传统for循环最大的区别在于,高于for循环需要传递要遍历的集合或者数组
13     遍历数组通常用传统的for循环,因为传统的for循环可以提取数组的角标,便于操作数组
14 */
15 import java.util.*;
16 class ForEachDemo
17 {
18     public static void main(String[] args) 
19     {
20         ArrayList<String> al = new ArrayList<String>();
21         al.add("abc");
22         al.add("bcd");
23         al.add("cde");
24         al.add("ecf");
25         /*
26         迭代器方式
27         Iterator<String> it = al.iterator(); 
28         while(it.hasNext())
29         {
30             System.out.println(it.next());
31         }
32         */
33         for(String s:al)        //迭代器的替换,因为是JDK5之后才出现的高级for循环,所以必须由泛型,所以这个程序中的ArrayList要加上泛型
34             //s="KK";                //高级for循环的循环原理是这里的s在移动,当我改变s值时,其实是没有改变集合的
35             //sop(al);
36             sop(s);
37         for (Iterator<String> it = al.iterator();it.hasNext() ; )    //传统的for循环迭代集合,外国人常用
38         {
39             System.out.println(it.next());
40         }
41 
42 
43         String[] arr ={"a","b","c","d"};        //高级for循环也可以迭代数组
44         for(String t:arr)
45             sop(t);
46 
47         for (int x=0;x<arr.length;x++)            
48         {
49             if(x!=arr.length)            //通常遍历数组用传统for循环,因为,传统for循环可以提取数组元素的角标
50             System.out.println(arr[x]);
51         }
52     
53     //HashMap如何运用高级for循环,先keySet或者entrySet,然后再用高级for循环
54         HashMap<Integer,String> hm = new HashMap<Integer,String>();
55         hm.put(1,"abc");
56         hm.put(2,"bcd");
57         hm.put(3,"cde");
58          Set<Integer> i = hm.keySet();
59         for(Integer t:i)
60             sop(hm.get(t));
61         /*
62         Set<Map.Entry<Integer,String>> st = hm.entrySet();
63         for(Map.Entry<Integer,String> m:st)
64         */
65         for(Map.Entry<Integer,String> m:hm.entrySet())    //上面的简写
66             sop(m.getKey()+"---"+m.getValue());
67         
68     }
69     public static void sop(Object o)
70     {
71         System.out.println(o);
72     }
73 
74 
75 }
 1 //java基础视频教程第17天-19-集合(可变参数)
 2 /*
 3     这节课主要讲解了可变参数,最重要点是可变参数的注意事项:必须把可变参数放在参数类表的最后面(左边)
 4     可变参数是为了简化传统方式的传递数组的形式,少了new数组的这个步骤
 5 */
 6 class ParamDemo
 7 {
 8     public static void main(String[] args) 
 9     {
10         //show(4);            //传统的方式传递参数
11         //show(4,3);        //传统的方式传递参数
12 
13 
14         //int[] arr ={1,3,4,67,8};    //传统方式改进的方法就是把数组当做参数传入,但是还是需要new数组,
15         //show(arr);    
16         show();
17         show(1,2454,66,6);
18         //show1(1,2,3,5,6,"hahh");        //如果有其它的参数类则应该房子可变参数的后边,这样写是错误的 
19         show1("jja",1,12,5,6);
20     }
21     /*
22     传统的方式传递多个参数需要不断重写一个方法,
23     public static void show(int a)    //传统的方式传递参数
24     {
25         sop(a);
26     }
27     public static void show(int a,int b)    //传统的方式传递参数
28     {
29         sop(a+b);
30     }
31     */
32     /*
33     public static void show(int[] arr)    //传统方式改进的方法就是把数组当做参数传入,但是还是需要new数组,
34     {
35         sop(a+b);
36     }
37     */
38     public static void show(int... arr)        //新特性,JDK1.5之后出现的可变参数是基于数组的形式的简化,和传递数组对比,这个少了new数组的麻烦
39     {
40         sop(arr.length);
41     }
42     /*
43     public static void show1(int... arr,String s)//在可变参数中有其它的参数则应该把其他的参数放在最前面,此种写法是错误的
44     {
45         sop(arr.length);
46     }
47     */
48     public static void show1(String s,int... arr)//在可变参数中有其它的参数则应该把其他的参数放在最前面,此种写法是对的
49     {
50         sop(arr.length);
51     }
52     public static void sop(Object o)        
53     {
54         System.out.println(o);
55     }
56 }
 1 //java基础视频教程第17天-20-集合(静态导入)
 2 /*
 3     本节课主要讲解了静态导入,静态导入就是导入一个类中的所有静态成员,简化了代码量
 4     像java.util包中的Arrays和Collections等等中的方法都是静态的,就可以静态导入
 5     
 6     但是静态导入必须注意一个问题,就是当这个类有继承的时候,如果它的父类有相同的方法时,就
 7     必须明确时谁的方法,否则会出错
 8 
 9     注意一点,导入的中没有写static就是导入的类,如果导入中写了static则是导入的某个类的所有静态成员
10 */
11 import java.util.*;        //java.util中的所有类
12 import static java.util.Arrays.*;    //导入Arrays这个类中的所有静态成员,不要忘记加上static
13 import static java.lang.System.*;    //导入System这个类中的所有静态成员,可以不写System了
14 class StaticDemo
15 {
16     public static void main(String[] args) 
17     {
18         int[] arr = {3,7,6,1};
19         //Arrays.sort(arr);        //自动排序,如果不静态导入就这样写
20         sort(arr);                //静态导入,可以省略Arrays
21         //sop(toString(arr));        //将数组以字符串形式形式打印,此处要注意,由于类StaticDemo继承了Object,而Object中也有toString()方法,只是没有传参数,如果这里把Array去掉,就会默认是Object的,但是Object中没有传入参数,所以这里会出错
22         sop(Arrays.toString(arr));            //此处绝对要注意,当一个类中调用的国歌类的共同方法时一定要注明是谁的方法
23     }
24     public static void sop(Object o)
25     {
26         out.println(o);                //看到没得,没写该死的System
27     }
28 }

 

posted @ 2013-05-27 12:35  ysfox  阅读(151)  评论(0)    收藏  举报