zoukankan      html  css  js  c++  java
  • java基础--泛型与排序

    一. 泛型概念的提出(为什么需要泛型)?

    首先,我们看下下面这段简短的代码: 

      public class GenericTest {
    
         public static void main(String[] args) {
            List list = new ArrayList();
            list.add("qqyumidi");
             list.add("corn");
             list.add(100);
           for (int i = 0; i < list.size(); i++) {
                String name = (String) list.get(i); // 1
               System.out.println("name:" + name);
           }
        }
     }

    在如上的编码过程中,我们发现主要存在两个问题:

    1.当我们将一个对象放入集合中,集合不会记住此对象的类型,当再次从集合中取出此对象时,改对象的编译类型变成了Object类型,但其运行时类型任然为其本身类型。

    2.因此,//1处取出集合元素时需要人为的强制类型转化到具体的目标类型,且很容易出现“java.lang.ClassCastException”异常。

    二.什么是泛型?

         泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此       时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

             泛型的定义:泛型是JDK 1.5的一项新特性,它的本质是参数化类型(Parameterized Type)的应用,也就是说所操作的数据类型被指定为一个参数,在用到的时候在指定具体的类型。这种参数类型可以用在类、            接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法

    三.泛型的使用

    泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法      注: 没有泛型数组,也没有泛型多态

    3.1  泛型类

      

    格式
        class 类名<字母列表>{
          修饰符   字母   属性;
          修饰符   构造器 (字母) {}
          修饰符   返回类型   方法名 (字母) {
           }

      T Type 表示类型。
      K V 分别代表键值中的Key Value。
      E 代表Element。

    注意:
        1、泛型只能使用引用类型,不能基本类型
        2、在泛型类里,泛型声明时字母不能使用 静态属性|静态方法上,在泛型方法上可以声明在方法上

    package com.zwj.fanxing;
    /**
    *泛型的擦除
    *1、继承|实现声明 不指定类型
    *2、使用时 不指定类型 
    *  统一Object 对待 
    *1、编译器警告 消除使用Object
    *2、不完全等同于Object ,编译不会类型检查
     * @author Administrator
     *
     * @param <T>
     */
    public class Student<T> {
        private T javaScore;
        private T oracleScore;
        
        //泛型声明时不能使用 静态属性|静态方法上
        //private static T1 test;
        
        
        public T getJavaScore() {
            return javaScore;
        }
    
    
    
    
        public void setJavaScore(T javaScore) {
            this.javaScore = javaScore;
        }
    
    
    
    
        public T getOracleScore() {
            return oracleScore;
        }
    
    
    
    
        public void setOracleScore(T oracleScore) {
            this.oracleScore = oracleScore;
        }
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            Student stu1 = new Student(); 
            //消除警告 使用 Object
            Student<Object> stu = new Student<Object>(); 
            //stu.setJavaScore("af"); //以Object对待
            
            test(stu1); //stu1 相当于Object 但是不完全等同Object
            //擦除,不会类型检查
            //test(stu);
            test1(stu1);
            test1(stu);
            
        }
        
        public static  void test(Student<Integer> a){
            
        }
        public static  void test1(Student<?> a){
            
        }
        }
    Student 泛型类

    3.2 泛型接口、

       i nterface  接口名 <字母列表> {
       修饰符 返回类型 方法(方法);
      }
    //因为不能使用在静态属性上,更不能用在全局常量上

    package com.zwj.fanxing;
    /**
     * 接口中 泛型字母只能使用在方法中,不能使用在全局常量中
     * @author Administrator
     *
     * @param <T>
     */
    public interface Comparator<T> {
        void compare(T t);    
    }
    Comparator 接口中 泛型字母只能使用在方法中,不能使用在全局常量中
    package com.zwj.fanxing;
    /**
     * 泛型接口:与继承同理
     * 重写方法随父类而定
     *
     * @param <T>
     */
    public interface package com.zwj.fanxing;
    /**
     * 泛型接口:与继承同理
     * 重写方法随父类而定
     *
     * @param <T>
     */
    public interface Comparable<T> {
        void compare(T t);
    }
    
    //声明子类指定具体类型
    class Comp implements Comparable<Integer>{
    
        @Override
        public void compare(Integer t) {
            // TODO Auto-generated method stub
            
        }
        
    }
    
    //擦除
    class Comp1 implements Comparable{
    
        @Override
        public void compare(Object t) {
            // TODO Auto-generated method stub
            
        }
         
    }
    //父类擦除,子类泛型
    class Comp2<T> implements Comparable{
    
        @Override
        public void compare(Object t) {
            // TODO Auto-generated method stub
            
        }
         
    }
    //子类泛型>=父类泛型
    class Comp3<T> implements Comparable<T>{
    
        @Override
        public void compare(T t) {
            // TODO Auto-generated method stub
            
        }
         
    }
    //父类泛型,子类擦除 错误{
        void compare(T t);
    }
    
    //声明子类指定具体类型
    class Comp implements Comparable<Integer>{
    
        @Override
        public void compare(Integer t) {
            // TODO Auto-generated method stub
            
        }
        
    }
    
    //擦除
    class Comp1 implements Comparable{
    
        @Override
        public void compare(Object t) {
            // TODO Auto-generated method stub
            
        }
         
    }
    //父类擦除,子类泛型
    class Comp2<T> implements Comparable{
    
        @Override
        public void compare(Object t) {
            // TODO Auto-generated method stub
            
        }
         
    }
    //子类泛型>=父类泛型
    class Comp3<T> implements Comparable<T>{
    
        @Override
        public void compare(T t) {
            // TODO Auto-generated method stub
            
        }
         
    }
    //父类泛型,子类擦除 错误
    Comparable 泛型接口:与继承

    3.3泛型方法 

      修饰符 <字母> 返回类型 方法名(字母){
      }
    //注意: 泛型还可以定义在方法中,是否拥有泛型方法,与其所有的类是否泛型没有关系

     注:只能访问对象的信息,不能修改信息

    package com.zwj.fanxing;
    import java.io.Closeable;
    import java.io.IOException;
    
    /**
     * 泛型方法 <> 返回类型前面
     * 只能访问对象的信息,不能修改信息
     * @author Administrator
     *
     */
    public class TestMethod {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            test("a"); //T -->String
        }
        //泛型方法
        public static <T> void test(T a){        
            System.out.println(a);
        }
        // extends <=
        public static <T extends Closeable> void test(T... a){        
            for(T temp:a){
                try {
                    if(null!=temp){
                        temp.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    TestMethod 泛型方法 <> 返回类型前面

    3.4 没有泛型多态 

          通配符
                       ?类型不定,使用时确定类型
                       ?使用:声明类型|声明方法上,不能声明类或使用时
                       ? extends : <= 上限 指定类型 子类或自身
                       ? super :>=下限 指定类型 为自身或父类

    package com.zwj.fanxing;
    
    //泛型类
    public class A<T> {
    }
    A 泛型类
    package com.zwj.fanxing;
    
    public class Fruit {
    
    }
    
    class Apple extends Fruit{
        
    }
    Apple extends Fruit
    package com.zwj.fanxing;
    /**
     * 通配符
     * ?类型不定,使用时确定类型
     * ?使用:声明类型|声明方法上,不能声明类或使用时
     * ? extends : <= 上限  指定类型 子类或自身
     * ? super :>=下限   指定类型 为自身或父类
     * @author Administrator
     *
     */
    public class Student<T> {
        T score;
        public static void main(String[] args) {
            Student<?> stu = new Student<String>();
             test(new Student<Integer>());
            
             test2(new Student<Apple>());
            
            //test3(new Student<Apple>()); //泛型没有多态        
             
            //test4(new Student<Apple>()); //  <   apple extends fruit    Student<? super Fruit>  表示是大于等于fruit
              
            test4(new Student<Object>());
            
            test4(new Student<Fruit>());
            
        }
        
        public static void test(Student<?> stu){
            System.out.println("Student<Integer>()");
        }
        // <=
        public static void test2(Student<? extends Fruit> stu){
            System.out.println("Student<? extends Fruit>");
            
        }
        //泛型没有多态
        public static void test3(Student<Fruit> stu){
            System.out.println("Student<Apple>()");
            
        }
        //  <   apple extends fruit    Student<? super Fruit> 表示是大于等于fruit
        public static void test4(Student<? super Fruit> stu){
            System.out.println("Student<? super Fruit>");
            
        }
        
    }
    Student 通配符 泛型没有多态
    package com.zwj.fanxing;
    
    
    public class Bjsxt <T>{
          T stu ;
     public static void main(String[] args) {
         //泛型的嵌套 
         Bjsxt<Student<String>> room =new  Bjsxt<Student<String>>();
         //从外到内拆分
         room.stu = new Student<String>();
         Student<String> stu = room.stu;
         String score =stu.score;
         System.out.println(score);
    }
    }
    Bjsxt<Student> 泛型的嵌套

    四.  排序和应用类型排序

    package com.zwj.bubble;
    import java.util.Arrays;
    
    /**
     * 最终版本:考虑存在顺序
     * @author Administrator
     *
     */
    public class BubbleSort {
    
        /**
         * @param args
         */
        public static void main(String[] args) {        
            int[] arr ={1,2,9,3,4};
            sort1(arr);
    
            System.out.println("==========final============");
            arr =new int[]{9,1,2,3,4};
            sortFinal(arr);
        }
        //第二版本,减少每一趟的次数
        public static void sortFinal(int[] arr){
                boolean sorted= true;
                int len =arr.length;
                for(int j=0;j<len-1;j++){ //趟数
                    sorted =true; //假定有序
                    for(int i=0;i<len-1-j;i++){ //次数
                        if(arr[i]>arr[i+1]){
                            int temp = arr[i];
                            arr[i] =arr[i+1];
                            arr[i+1] =temp;
                            sorted =false; //假定失败
                        }
                        System.out.println(Arrays.toString(arr));
                    }
                    if(sorted){ //减少趟数
                        break;
                    }
                }
            }
    
        //第二版本,减少每一趟的次数
        public static void sort1(int[] arr){
                int len =arr.length;
                for(int j=0;j<len-1;j++){ //趟数
                    System.out.println("第"+(j+1)+"趟");
                    for(int i=0;i<len-1-j;i++){ //次数
                        System.out.print("第"+(i+1)+"次");
                        if(arr[i]>arr[i+1]){
                            int temp = arr[i];
                            arr[i] =arr[i+1];
                            arr[i+1] =temp;
                        }
                        System.out.println(Arrays.toString(arr));
                    }
                }
            }
    
    }
    /*第1趟
    第1次[1, 2, 9, 3, 4]
    第2次[1, 2, 9, 3, 4]
    第3次[1, 2, 3, 9, 4]
    第4次[1, 2, 3, 4, 9]
    第2趟
    第1次[1, 2, 3, 4, 9]
    第2次[1, 2, 3, 4, 9]
    第3次[1, 2, 3, 4, 9]
    第3趟
    第1次[1, 2, 3, 4, 9]
    第2次[1, 2, 3, 4, 9]
    第4趟
    第1次[1, 2, 3, 4, 9]
    ==========final============
    [1, 9, 2, 3, 4]
    [1, 2, 9, 3, 4]
    [1, 2, 3, 9, 4]
    [1, 2, 3, 4, 9]
    [1, 2, 3, 4, 9]
    [1, 2, 3, 4, 9]
    [1, 2, 3, 4, 9]
    */
    BubbleSort 冒泡排序
    package com.zwj.innertype;
    
    
    import java.util.Arrays;
    
    public class Demo02 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            String[] arr ={"a","abcd","abc","def"};
            //从到小排序 降序
            boolean sorted= true;
            int len =arr.length;
            for(int j=0;j<len-1;j++){ //趟数
                sorted =true; //假定有序
                for(int i=0;i<len-1-j;i++){ //次数
                    if(((Comparable)arr[i]).compareTo(arr[i+1])<0){
                        String temp = arr[i];
                        arr[i] =arr[i+1];
                        arr[i+1] =temp;
                        sorted =false; //假定失败
                    }
                }
                if(sorted){ //减少趟数
                    break;
                }
            }
            
            System.out.println(Arrays.toString(arr));
        }
    
    }
    /*
     [def, abcd, abc, a]*/
     
    Demo02 字符串比较
    package com.zwj.innertype;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Date;
    import java.util.List;
    
    public class Demo04 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            Date[] arr =new Date[3];
            arr[0] =new Date();
            arr[1] =new Date(System.currentTimeMillis()-1000*60*60);
            arr[2] =new Date(System.currentTimeMillis()+1000*60*60);
            Utils.sort(arr); //降序
            System.out.println(Arrays.toString(arr));
            
            
            //字符串
            String[] arr2 ={"a","abcd","abc","def"};
            Utils.sort(arr2);
            System.out.println(Arrays.toString(arr2));
            
            
            System.out.println("==========List排序===========");
            //存放容器中
            List<String> list =new ArrayList<String>();
            list.add("a");
            list.add("abcd");
            list.add("abc");
            list.add("def");
            Utils.sort(list);
            System.out.println(list);
            
            
            
            
            System.out.println("==========使用Comparator 排序数组===============");
            arr2 =new String[]{"a","abcd","abc","def"};
            Utils.sort(arr2,new StringComp());
            System.out.println(Arrays.toString(arr2));
            
            System.out.println("==========List排序+比较器===========");
            list =new ArrayList<String>();
            list.add("a");
            list.add("abcd");
            list.add("abc");
            list.add("def");
            Utils.sort(list,new StringComp());
            System.out.println(list);
            
        }
    }
    /*
     [Sat Nov 18 16:03:15 CST 2017, Sat Nov 18 15:03:15 CST 2017, Sat Nov 18 14:03:15 CST 2017]
    [def, abcd, abc, a]
    ==========List排序===========
    [def, abcd, abc, a]
    ==========使用Comparator 排序数组===============
    [a, abc, def, abcd]
    ==========List排序+比较器===========
    [a, abc, def, abcd]*/
     
    Demo04 时间 和集合比较
    package com.zwj.innertype;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    /**
     * 使用Collections对容器的比较
     * 1、 public static <T> void sort(List<T> list, Comparator<? super T> c)  
     * 2、public static <T extends Comparable<? super T>> void sort(List<T> list)  
     * void sort(List<T> list)
     * @author Administrator
     *
     */
    public class Demo05 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            List<String> list =new ArrayList<String>();
            list.add("a");
            list.add("abcd");
            list.add("abc");
            list.add("def");
            Collections.sort(list,new StringComp());
            System.out.println(list);
            
            
            list =new ArrayList<String>();
            list.add("a");
            list.add("abcd");
            list.add("abc");
            list.add("def");
            Collections.sort(list);
            System.out.println(list);
            
            
        }
    
    }
    /*[abcd, abc, def, a]
    [a, abc, abcd, def]*/
    Demo05 Collections API工具类比较
    package com.zwj.innertype;
    import java.util.Comparator;
    import java.util.List;
    
    
    
    /**
     * 排序
     * @author Administrator
     *
     */
    public class Utils {
        /**
         * List的排序+比较器
         * @param list
         * @param com
         */
        public static  <T> void sort(List<T> list,Comparator<T> com){
            //第一步:转成数组
            Object[] arr =list.toArray();
            sort(arr,com);
            //第二步:改变容器中对应的值
            for(int i=0;i<arr.length;i++){
                list.set(i, (T)(arr[i]));
            }
        }
        
        
        /**
         * 数组的排序 (降序)+Comparator接口
         * @param arr
         */
        public static <T> void sort(Object[] arr,Comparator<T> com){
            //从大到小排序 降序
                boolean sorted= true;
                int len =arr.length;
                for(int j=0;j<len-1;j++){ //趟数
                    sorted =true; //假定有序
                    for(int i=0;i<len-1-j;i++){ //次数
                        if(com.compare((T)arr[i], (T)arr[i+1])<0){
                            Object temp = arr[i];
                            arr[i] =arr[i+1];
                            arr[i+1] =temp;
                            sorted =false; //假定失败
                        }
                    }
                    if(sorted){ //减少趟数
                        break;
                    }
                }
        }
        
        
        
        /**
         * 容器排序 (使用泛型方法)
         */
        public static <T extends Comparable<T>> void sort(List<T> list){
            //第一步:转成数组
            Object[] arr =list.toArray();
            sort(arr);
            //第二步:改变容器中对应的值
            for(int i=0;i<arr.length;i++){
                list.set(i, (T)(arr[i]));
            }
            
        }
        
        
        /**
         * 数组排序 (使用泛型方法)
         */
        public static <T extends Comparable<T>> void sort(T[] arr){
            //从大到小排序 降序
            boolean sorted= true;
            int len =arr.length;
            for(int j=0;j<len-1;j++){ //趟数
                sorted =true; //假定有序
                for(int i=0;i<len-1-j;i++){ //次数
                    if(((Comparable)arr[i]).compareTo(arr[i+1])<0){
                        T temp = arr[i];
                        arr[i] =arr[i+1];
                        arr[i+1] =temp;
                        sorted =false; //假定失败
                    }
                }
                if(sorted){ //减少趟数
                    break;
                }
            }
        }    
        
        /**
         * 数组的排序 (降序)
         * @param arr
         */
        public static void sort(Object[] arr){
            //从大到小排序 降序
            boolean sorted= true;
            int len =arr.length;
            for(int j=0;j<len-1;j++){ //趟数
                sorted =true; //假定有序
                for(int i=0;i<len-1-j;i++){ //次数
                    if(((Comparable)arr[i]).compareTo(arr[i+1])<0){
                        Object temp = arr[i];
                        arr[i] =arr[i+1];
                        arr[i+1] =temp;
                        sorted =false; //假定失败
                    }
                }
                if(sorted){ //减少趟数
                    break;
                }
            }
            
        }
        
        
    }
    Utils List的排序比较器工具
    package com.zwj.innertype;
    /**
     * 排序规则的业务类
     * @author Administrator
     *
     */
    public class StringComp  implements java.util.Comparator<String>{
        
        /**
         * 按长度比较大小 
         * 正数 >
         * 负数 <
         * 0 ==
         */
        @Override
        public int compare(String o1, String o2) {
            int len1 =o1.length();
            int len2 =o2.length();        
            return -(len1-len2);
        }
        
    
    }
    StringComp 排序规则的业务类

      引用类型对象的排序

    package com.zwj.reftype;
    /**
     * 实体类
     * @author Administrator
     *
     */
    public class Goods {
        //商品名称
        private String name;
        //价格
        private double price;
        //收藏量
        private int fav;
        public Goods() {
            // TODO Auto-generated constructor stub
        }
        
        
        
        public Goods(String name, double price, int fav) {
            super();
            this.name = name;
            this.price = price;
            this.fav = fav;
        }
    
    
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public double getPrice() {
            return price;
        }
        public void setPrice(double price) {
            this.price = price;
        }
        public int getFav() {
            return fav;
        }
        public void setFav(int fav) {
            this.fav = fav;
        }
        
        
        @Override
        public String toString() {
            return "商品名:"+name+",收藏量"+this.fav+",价格:"+this.price+"
    ";
        }
    }
    Goods 实体类
    package com.zwj.reftype;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public class GoodsApp {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            List<Goods> list =new ArrayList<Goods>();
            list.add(new Goods("老马视频",100,2000));
            list.add(new Goods("老高视频",50,2000));
            list.add(new Goods("老裴视频",1000,1000));
            System.out.println("排序前:"+list);
            Collections.sort(list,new GoodsPriceComp());
            /*
             * 排序前:[商品名:老马视频,收藏量2000,价格:100.0, 商品名:老高视频,收藏量2000,价格:50.0, 商品名:老裴视频,收藏量1000,价格:1000.0]
             * 排序后:[商品名:老裴视频,收藏量1000,价格:1000.0, 商品名:老马视频,收藏量2000,价格:100.0, 商品名:老高视频,收藏量2000,价格:50.0]
             */
            //Collections.sort(list,new GoodsFavComp());
            /*
             *排序前:[商品名:老马视频,收藏量2000,价格:100.0 , 商品名:老高视频,收藏量2000,价格:50.0 ,商品名:老裴视频,收藏量1000,价格:1000.0 ]
             *排序后:[商品名:老裴视频,收藏量1000,价格:1000.0 ,商品名:老马视频,收藏量2000,价格:100.0 , 商品名:老高视频,收藏量2000,价格:50.0 ]
             */
            System.out.println("排序后:"+list);
        }
    
    }
    GoodsApp 排序
    package com.zwj.reftype;
    /**
     * 按收藏量排序的业务类 (升序)
     * @author Administrator
     *
     */
    public class GoodsFavComp implements java.util.Comparator<Goods> {
    
        @Override
        public int compare(Goods o1, Goods o2) {
            return o1.getFav()-o2.getFav();
        }
    
    }
    GoodsFavComp 按收藏量排序
    package com.zwj.reftype;
    
    /**
     * 按价格排序的业务类 (降序)
     * @author Administrator
     *
     */
    
    public class GoodsPriceComp implements java.util.Comparator<Goods> {
    
        @Override
        public int compare(Goods o1, Goods o2) {
            //- 负数 表示降序     默认的是升序
            return -(o1.getPrice()-o2.getPrice()>0?1:(o1.getPrice()==o2.getPrice()?0:-1));
        }
    
    }
    GoodsPriceComp 按价格排序的业务类

     新闻类的排序

    package com.zwj.reftype;
    
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    /**
     * 新闻条目实体类
     * @author Administrator
     *
     */
    public class NewsItem implements java.lang.Comparable<NewsItem>{
        //标题
        private String title;
        //点击量
        private int hits;
        //时间
        private Date pubTime;
        public NewsItem() {
        }
        
        
        public NewsItem(String title, int hits, Date pubTime) {
            super();
            this.title = title;
            this.hits = hits;
            this.pubTime = pubTime;
        }
    
    
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
        public int getHits() {
            return hits;
        }
        public void setHits(int hits) {
            this.hits = hits;
        }
        public Date getPubTime() {
            return pubTime;
        }
        public void setPubTime(Date pubTime) {
            this.pubTime = pubTime;
        }
    
        //时间降序 +点击量升序+标题降序
        @Override
        public int compareTo(NewsItem o) {
            int result =0;
            //比较 时间
            result =-this.pubTime.compareTo(o.pubTime); //降序
            if(0==result){ //时间相同
                //点击量 
                result =this.hits-o.hits; //升序
                if(0==result){ //点击量相同
                     //标题
                    result=-this.title.compareTo(o.title);//降序
                }
            }        
            
            return result;
        }
        
        @Override
        public String toString() {
            StringBuilder sb =new StringBuilder();
            sb.append("标题:").append(this.title);
            sb.append(",时间:").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.pubTime));
            sb.append(",点击量:").append(this.hits).append("
    ");
            return sb.toString();
        }
    
        
    }
    NewsItem 新闻条目实体类
    package com.zwj.reftype;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Date;
    import java.util.List;
    
    import com.zwj.innertype.Utils;
    
    
    /**
     * 使用Collections
     * @author Administrator
     *
     */
    public class NewsItemApp {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            List<NewsItem> news=new ArrayList<NewsItem>();
            news.add(new NewsItem("美国后怕了,逃跑了悲剧了",50,new Date(System.currentTimeMillis()-1000*60*60)));
            news.add(new NewsItem("中国登上钓鱼岛了,全国欢呼了",100,new Date()));
            news.add(new NewsItem("小日本终于听话了,泪流满面笑了",60,new Date(System.currentTimeMillis()-1000*60*60)));
            System.out.println("排序前:"+news);        
            //时间降序 +点击量升序+标题降序   
            Collections.sort(news);      
             //Utils.sort(news);
            System.out.println("排序后"+news);
            
            
            
        }
    
    }
    /*排序前:[标题:美国后怕了,逃跑了悲剧了,时间:2017-11-18 14:40:44,点击量:50
    , 标题:中国登上钓鱼岛了,全国欢呼了,时间:2017-11-18 15:40:44,点击量:100
    , 标题:小日本终于听话了,泪流满面笑了,时间:2017-11-18 14:40:44,点击量:60
    ]
    排序后[标题:中国登上钓鱼岛了,全国欢呼了,时间:2017-11-18 15:40:44,点击量:100
    , 标题:美国后怕了,逃跑了悲剧了,时间:2017-11-18 14:40:44,点击量:50
    , 标题:小日本终于听话了,泪流满面笑了,时间:2017-11-18 14:40:44,点击量:60
    ]*/
    NewsItemApp 使用Collections排序 时间降序 +点击量升序+标题降序

     treeMap和treeSet 排序 引用类型对象

    package com.zwj.col;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public class Person {
        private final String name;//名称
        private final int handsome;//帅气指数
        
        public Person() {
            name =null;
            handsome =0;
        }
    
        public Person(String name, int handsome) {
            super();
            this.name = name;
            this.handsome = handsome;
        }
    
        public String getName() {
            return name;
        }
    
        
    
        public int getHandsome() {
            return handsome;
        }
    
        
        
        @Override
        public String toString() {
            return "姓名:"+this.name+",帅气指数:"+this.handsome+"
    ";
        }
        
        
    
    }
    Person 实体类
    package com.zwj.col;
    import java.util.Set;
    import java.util.TreeMap;
    
    public class TreeMapDemo {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            Person p1 =new Person("您",100);
            Person p2 =new Person("刘德华",1000);
            Person p3 =new Person("梁朝伟",1200);
            Person p4 =new Person("老裴",50);
            
            TreeMap<Person,String> map =new TreeMap<Person,String>(new java.util.Comparator<Person>(){
    
                @Override
                public int compare(Person o1, Person o2) {
                    return -(o1.getHandsome()-o2.getHandsome());
                }
            } );
            map.put(p1, "bjsxt");
            map.put(p2, "bjsxt");
            map.put(p3, "bjsxt");
            map.put(p4, "bjsxt");
            
            //查看键
            Set<Person> persons =map.keySet();
            System.out.println(persons);
        }
    
    }
    /*
     [姓名:梁朝伟,帅气指数:1200, 姓名:刘德华,帅气指数:1000, 姓名:您,帅气指数:100, 姓名:老裴,帅气指数:50]*/
    TreeMapDemo 匿名内部类
    package com.zwj.col;
    import java.util.TreeSet;
    /**
     * 提供了 解耦的方式:业务排序类
     * @author Administrator
     *
     */
    public class TreeSetDemo {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            Person p1 =new Person("您",100);
            Person p2 =new Person("刘德华",1000);
            Person p3 =new Person("梁朝伟",1200);
            Person p4 =new Person("老裴",50);
            
            //依次存放到TreeSet容器中,使用排序的业务类(匿名内部类)
            TreeSet<Person> persons =new TreeSet<Person>(
                        new java.util.Comparator<Person>(){
    
                            @Override
                            public int compare(Person o1, Person o2) {
                                return -(o1.getHandsome()-o2.getHandsome());
                            }
                            
                        }
                    );
            persons.add(p1);
            //TreeSet 在添加数据时排序
            persons.add(p2);
            persons.add(p3);
            persons.add(p4);
            
            System.out.println(persons);
            
            /*
            //改变数据
            p4.setHandsome(100);
            p4.setName("您");
            */ 
            //p4 与p1 内容重复 
            System.out.println(persons);
            
        }
    
    }
    /*[姓名:梁朝伟,帅气指数:1200
    , 姓名:刘德华,帅气指数:1000
    , 姓名:您,帅气指数:100
    , 姓名:老裴,帅气指数:50
    ]
    [姓名:梁朝伟,帅气指数:1200
    , 姓名:刘德华,帅气指数:1000
    , 姓名:您,帅气指数:100
    , 姓名:老裴,帅气指数:50
    ]
    */
    TreeSetDemo 匿名内部类
    package com.zwj.col;
    
    public class Worker implements java.lang.Comparable<Worker> {
        //工种
        private String type;
        //工资
        private double salary;
        public Worker() {
            // TODO Auto-generated constructor stub
        }
        
        
        public Worker(String type, double salary) {
            super();
            this.type = type;
            this.salary = salary;
        }
    
    
        public String getType() {
            return type;
        }
        public void setType(String type) {
            this.type = type;
        }
        public double getSalary() {
            return salary;
        }
        public void setSalary(double salary) {
            this.salary = salary;
        }
    
        /**
         * 按工资升序
         */
        @Override
        public int compareTo(Worker o) {
            return this.salary>o.salary?1:( this.salary==o.salary?0:-1);
        }
        
        @Override
        public String toString() {
            return "工种:"+this.type+",工资:"+this.salary+"
    ";
        }
        
    }
    Worker 实体类
    package com.zwj.col;
    import java.util.TreeMap;
    
    public class TreeMapDemo02 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            Worker w1 =new Worker("垃圾回收员",12000);
            Worker w2 =new Worker("农民工",8000);
            Worker w3 =new Worker("程序猿",5000);
            //按工资升序
            TreeMap<Worker,String > employees =new TreeMap<Worker,String >();
            employees.put(w1,"bjsxt");
            employees.put(w2,"bjsxt");
            employees.put(w3,"bjsxt");
            System.out.println(employees.keySet());
        }
    
    }
    /*
     [工种:程序猿,工资:5000.0, 工种:农民工,工资:8000.0, 工种:垃圾回收员,工资:12000.0]*/
    TreeMapDemo02 实体类实现Comparable 接口的应用
    package com.zwj.col;
    
    import java.util.TreeSet;
    /**
     * 实体类实现Comparable 接口的应用
     * @author Administrator
     *
     */
    public class TreeSetDemo2 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            Worker w1 =new Worker("垃圾回收员",12000);
            Worker w2 =new Worker("农民工",8000);
            Worker w3 =new Worker("程序猿",5000);
            
            TreeSet<Worker> employees =new TreeSet<Worker>();
            employees.add(w1);
            employees.add(w2);
            employees.add(w3);
            System.out.println(employees);
            
        }
    
    }
    /*[工种:程序猿,工资:5000.0
    , 工种:农民工,工资:8000.0
    , 工种:垃圾回收员,工资:12000.0
    ]
    */
    TreeSetDemo2 实体类实现Comparable 接口的应用

     collections 模仿欢乐斗地主

    package com.zwj.col;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    /**
     *1、 binarySearch(List<? extends Comparable<? super T>> list, T key)   容器有序
     *2、sort(List<T> list) 
         sort(List<T> list, Comparator<? super T> c) 
     *3、reverse(List<?> list) 
      4、shuffle(List<?> list) 洗牌
      5、swap(List<?> list, int i, int j) 
     * @author Administrator
     *
     */
    public class CollectionsDemo01 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            List<Integer> cards =new ArrayList<Integer>();
            //shuffle 洗牌 模拟斗地主
            for(int i=0;i<54;i++){
                cards.add(i); 
            }
            //洗牌
            Collections.shuffle(cards) ;
            //依次发牌
            List<Integer> p1 =new ArrayList<Integer>();
            List<Integer> p2 =new ArrayList<Integer>();        
            List<Integer> p3 =new ArrayList<Integer>();
            List<Integer> last =new ArrayList<Integer>();
            for(int i=0;i<51;i+=3){
                p1.add(cards.get(i));
                p2.add(cards.get(i+1));
                p3.add(cards.get(i+2));
            }
            //最后三张为底牌
            last.add(cards.get(51));
            last.add(cards.get(52));
            last.add(cards.get(53));
            
            System.out.println("第一个人:"+p1);
            System.out.println("第二个人:"+p2);
            System.out.println("第三个人:"+p3);
            System.out.println("底牌为:"+last);
            
            
             test1();
            
            
        }
        //反转
        public static void test1(){
            List<Integer> list =new ArrayList<Integer>();
            list.add(1);
            list.add(3);
            list.add(2);
            list.add(4);
            System.out.println(list);
            Collections.reverse(list);
            System.out.println("反转之后"+list);
        }
    }
    /*
     第一个人:[8, 42, 7, 34, 26, 6, 17, 40, 35, 51, 52, 50, 44, 12, 11, 25, 39]
    第二个人:[27, 2, 0, 37, 29, 9, 23, 49, 20, 32, 14, 19, 48, 21, 45, 24, 3]
    第三个人:[1, 30, 43, 4, 10, 47, 5, 36, 22, 33, 18, 15, 38, 53, 31, 28, 41]
    底牌为:[46, 13, 16]
    [1, 3, 2, 4]
    反转之后[4, 2, 3, 1]
    */
    CollectionsDemo01 斗地主游戏

    this is a cat and that is a mice and where is the food?     统计每个单词出现的次数

    package com.zwj.map;
    public class Letter {
        private String name;
        private int count;
        public Letter() {
            // TODO Auto-generated constructor stub
        }
        public Letter(String name, int count) {
            super();
            this.name = name;
            this.count = count;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getCount() {
            return count;
        }
        public void setCount(int count) {
            this.count = count;
        }
        
        
        
    }
    Letter
    package com.zwj.map;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;
    
    /**
     * this is a cat and that is a mice and where is the food?
     * 统计每个单词出现的次数
     * 
     * 存储到Map中
     * key :String 
     * value:自定义类型
     * 
     * "分拣" 思路
     * 1、为所有key创建容器
     *    之后容器中存放对应value
     * 2、第一次创建容器,并存放值value
     *    第二次之后,直接使用容器存放值
     * @author Administrator
     *
     */
    public class Demo01 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            String str ="this is a cat and that is a mice and where is the food";
            //分割字符串
            String[] strArray=str.split(" ");
            //存储到Map中
            Map<String,Letter>  letters = new HashMap<String,Letter>();
            for(String temp:strArray){            
                /*
                 //1、为所有key创建容器         
                if(!letters.containsKey(temp)){
                    Letter col = new Letter();
                    col.setCount(1); //第一次值存放容器中
                    letters.put(temp, col);
                }else{
                    //2、     第二次之后,直接使用容器存放值
                    Letter col =letters.get(temp); //直接使用容器
                    col.setCount(col.getCount()+1);
                }*/
                Letter col = null;
                if(null==(col=letters.get(temp))){
                    col = new Letter();
                    col.setCount(1); //第一次值存放容器中
                    letters.put(temp, col);
                }else{
                    //2、     第二次之后,直接使用容器存放值                
                    col.setCount(col.getCount()+1);
                }
            }
            //输出Map的值
            Set<String> keys = letters.keySet();
            for(String key:keys){
                Letter col =letters.get(key);
                System.out.println("字母:"+key+",次数"+col.getCount());
            }
    /*字母:mice,次数1
    字母:that,次数1
    字母:cat,次数1
    字母:is,次数3
    字母:food,次数1
    字母:a,次数2
    字母:the,次数1
    字母:where,次数1
    字母:this,次数1
    字母:and,次数2*/
            
        }
        public static void test1(){
            String str ="this is a cat and that is a mice and where is the food";
            //分割字符串
            String[] strArray=str.split(" ");
            //存储到Map中
            Map<String,Letter>  letters = new HashMap<String,Letter>();
            /*
            for(String temp:strArray){
                
                 //1、为所有key创建容器
                      之后容器中存放对应value
                 
                if(!letters.containsKey(temp)){
                    letters.put(temp, new Letter());
                }
            }
            for(String temp:strArray){
                
                //  容器中存放对应value
                
                Letter col =letters.get(temp); //直接使用容器
                col.setCount(col.getCount()+1);
            }
            
            */
            for(String temp:strArray){
                
                 //1、为所有key创建容器         
                if(!letters.containsKey(temp)){
                    letters.put(temp, new Letter());
                }
                //2、     之后容器中存放对应value
                Letter col =letters.get(temp); //直接使用容器
                col.setCount(col.getCount()+1);
            }
            
            //输出Map的值
            Set<String> keys = letters.keySet();
            for(String key:keys){
                Letter col =letters.get(key);
                System.out.println("字母:"+key+",次数"+col.getCount());
            }
        }
    }
    Demo01 统计每个单词出现的次数

    定义一个Student类,属性:name 姓名,classNumber 班号,score 成绩,现在将若干Student对象放入List,请统计出每个班级的总分和平均分,分别打印出来

    package com.zwj.map;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 班级
     * @author Administrator
     *
     */
    public class ClassRoom {
        private String no;
        private List<Student> stus; //学生列表
        private double total; //总分
        public ClassRoom() {
            stus = new ArrayList<Student>();    
        }
        
        public ClassRoom(String no) {
            this();
            this.no = no;    
        }
        public String getNo() {
            return no;
        }
        public void setNo(String no) {
            this.no = no;
        }
        public List<Student> getStus() {
            return stus;
        }
        public void setStus(List<Student> stus) {
            this.stus = stus;
        }
        public double getTotal() {
            return total;
        }
        public void setTotal(double total) {
            this.total = total;
        }
        
        
        
    }
    ClassRoom 班级
    package com.zwj.map;
    public class Student {
        private String name;
        private String no;
        private double score;
        public Student() {
        }
        public Student(String name, String no, double score) {
            super();
            this.name = name;
            this.no = no;
            this.score = score;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getNo() {
            return no;
        }
    
        public void setNo(String no) {
            this.no = no;
        }
    
        public double getScore() {
            return score;
        }
    
        public void setScore(double score) {
            this.score = score;
        }
    
        @Override
        public String toString() {
            return "Student [name=" + name + ", no=" + no + ", score=" + score
                    + "]";
        }
    
    }
    Student 学生
    package com.zwj.map;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    /**
     * 定义一个Student类,属性:name 姓名,classNumber 班号,score 成绩
       现在将若干Student对象放入List,请统计出每个班级的总分和平均分,分别打印出来
     以面向对象的思维解决
     * @author Administrator
     *
     */
    public class MapDemo03 {
        public static void main(String[] args) {
            List<Student> list = new ArrayList<Student>();
            exam(list);        
            
            //统计        
            Map<String,ClassRoom> rooms = new HashMap<String,ClassRoom>();
            count(rooms,list);
            //打印
            printScore(rooms);
            /*班号为:001,总分160.0,平均分80.0
    班号为:002,总分80.0,平均分80.0
    班号为:003,总分160.0,平均分80.0*/
        }
        
        /**
         * 打印 总分与平均分
         */
        public static void printScore(Map<String,ClassRoom> rooms){
            Set<Map.Entry<String,ClassRoom>> entrySet =rooms.entrySet();
            Iterator<Map.Entry<String,ClassRoom>> it =entrySet.iterator();
            while(it.hasNext()){
                Map.Entry<String,ClassRoom> entry =it.next();
                ClassRoom room = entry.getValue();
                double avg = room.getTotal()/room.getStus().size();
                System.out.println("班号为:"+room.getNo()+",总分"+room.getTotal()+",平均分"+avg);
            }        
        }
        
        
        /**
         * 统计分数
         */
        public static void count(Map<String,ClassRoom> rooms,List<Student> list){
            for(Student stu:list){
                String no = stu.getNo();
                double score = stu.getScore();
                //根据班级编号 查看 Map是否存在该班级  分拣思路
                ClassRoom room = rooms.get(no);
                if(null==room){  //第一次
                    room = new ClassRoom(no);
                    rooms.put(no, room);
                }            
                //存储 总分
                room.setTotal(room.getTotal()+score);
                room.getStus().add(stu); //加入学生            
            }
        }
        
        
        /**
         * 现在将若干Student对象放入List
         * @param list
         */
        public static void exam(List<Student> list){
            list.add(new Student("a","001",80));
            list.add(new Student("b","001",80));
            list.add(new Student("a","002",80));
            list.add(new Student("c","003",80));
            list.add(new Student("d","003",80));
        }
    }
    MapDemo03 分拣

    使用自定义类型 接收签名:从界面上接收 到会人员的名单 放入 HashSet中点名:遍历输出名单

    package com.zwj.set;
    
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Scanner;
    import java.util.Set;
    /**
     * 使用自定义类型 接收签名:从界面上接收 到会人员的名单 放入 HashSet中
        点名:遍历输出名单
    
     * @author Administrator
     *
     */
    public class SetDemo04 {
        private Scanner sc ;
        private Set<Member> members;
        SetDemo04(){
            sc = new Scanner(System.in);
            members= new HashSet<Member>();
        }
        public String getStringFromConsole(){
            return sc.nextLine();
        }    
        
        //签名:
        public void addMemeber(Member mem){
            members.add(mem);
        }
        //点名:遍历输出名单
        public void showMemeber(){
            Iterator<Member> it = members.iterator();
            while(it.hasNext()){
                System.out.println(it.next());
            }
        }
        /**
         * @param args
         */
        public static void main(String[] args) {
            SetDemo04 demo = new SetDemo04();
            System.out.println("====签名======");
            while(true){
                String name =demo.getStringFromConsole();
                if(name.equalsIgnoreCase("over")){
                    break;
                }
                Member m =new Member(name);
                demo.addMemeber(m);
            }
            System.out.println("=========参会人员有====");
            demo.showMemeber();
            /*====签名======
    in
    am
    me
    over
    =========参会人员有====
    名单:me,签名时间:2017-11-18 18:00:39
    名单:am,签名时间:2017-11-18 18:00:36
    名单:in,签名时间:2017-11-18 18:00:33
    */
        }
    
    }
    
    
    class Member{
        private String name;
        private Date attendTime;
        public Member() {
            attendTime = new Date();
        }    
        
        public Member(String name) {
            this();
            this.name = name;    
        }
    
    
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Date getAttendTime() {
            return attendTime;
        }
        public void setAttendTime(Date attendTime) {
            this.attendTime = attendTime;
        }
    
        
    
        
        
        public Member(String name, Date attendTime) {
            super();
            this.name = name;
            this.attendTime = attendTime;
        }
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;        
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            return result;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Member other = (Member) obj;        
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }
    
        @Override
        public String toString() {
            return "名单:"+name+",签名时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(attendTime);
        }
        
        
    }
    SetDemo04
  • 相关阅读:
    如何优雅地用Redis实现分布式锁?
    redis 持久化有几种方式?
    怎么保证缓存和数据库数据的一致性?
    jedis 和 redisson 有哪些区别?
    redis支持哪些数据类型?redis命令大全
    什么是redis的缓存雪崩与缓存穿透?如何解决?
    redis 为什么是单线程的?
    什么是memecache?redis 和 memecache 有什么区别?
    Redis入门到精通(九)——Redis数据库基本操作(切换数据库,数据移动,删除数据)
    Redis入门到精通(八)——key通用指令基本操作、key扩展操作(时效性控制、查询模式)、key其他操作(为key改名)
  • 原文地址:https://www.cnblogs.com/ou-pc/p/7856190.html
Copyright © 2011-2022 走看看