zoukankan      html  css  js  c++  java
  • 遍历集合的常见方式,排序,用lambda表示是怎样的


       Collection集合的功能:
                Object[] toArray() 将集合转成数组
                Iterator iterator() 通过方法的调用 获取Iterator迭代器对象
       //  遍历集合的常见方式
            //方式1 Object[] toArray() 将集合转成数组
            //普通for 循环 遍历集合 toArray()方法 将集合转成Object[]数组
            Object[] arr = c.toArray();
            for(int i=0;i<arr.length;i++){
                System.out.println(arr[i]);
            }
            
            Collection c2 = new ArrayList();
            c2.add(new Student("王二麻子",20));
            c2.add(new Student("赵四",40));
            Object[] arr2 = c2.toArray();
            for(int i=0;i<arr2.length;i++){
                //向下转型
                Student s = (Student)arr2[i];
                System.out.println(s.getName());
            }
            //方式2 增强for循环
            /*
                格式
                    for(元素类型 变量名:要遍历的范围){
                        循环体语句
                    }
                    变量名 随便写
                    但是在增强for循环中 它代表的是当前遍历范围内的元素本身
                缺点:
                    丢掉了索引
                    就不能根据索引获取元素了
            */
            for(Object o:arr2){
                System.out.println(o);//arr2[i] 元素本身
                //向下转型
                Student s = (Student)o;
                System.out.println("增强for 循环:::::"+s.getName());
            }

            int[] arr3 ={1,2,3};
            for(int x:arr3){
                System.out.println(x);
            }
          迭代器:
           public static void main(String[] args)
        {
            Collection c = new ArrayList();
            c.add("a");
            c.add("b");
            c.add("c");
            c.add("d");
            System.out.println(c);
            c.add("qqq");
            //Iterator iterator() 迭代器
            Iterator it = c.iterator();
            /*
                boolean hasNext() 如果仍有元素可以迭代,则返回 true。
                Object next() 返回迭代的下一个元素。
                void remove() 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
            */
            //循环的结束条件是什么 hasNext()--> false 就结束
            while(it.hasNext()){
                Object obj = it.next();
                System.out.println(obj);
                if("b".equals(obj)){//为了避免出现空指针异常 在使用equals进行比较时 建议将常量写在前面
                    //it.remove();
                    //c.remove("b");//ConcurrentModificationException 多线程并发访问异常
                }
            }
            c.add("cccc");
            c.remove("a");
            System.out.println(c);
        }

    /*list
            增
                add(index,element)在指定位置添加元素 角标从0开始
                addAll(index,Collection)
            删
                remove(index)删除指定位置的元素 角标从0开始
            改
                set(int index, E element) 修改指定位置的元素 角标从0开始
            查
                get(int index) 获取指定位置的元素
                subList(int fromIndex, int toIndex)  
            */
    创建List 集合 存储Student对象 并对其进行排重处理
    public static void main(String[] args)
        {
            //创建List 集合 存储Student对象 并对其进行排重处理
            List list = new ArrayList();
            list.add(new Student("张飞",30));
            list.add(new Student("诸葛亮",40));
            list.add(new Student("曹操",50));
            list.add(new Student("诸葛亮",40));

            System.out.println(list);

            ArrayList newList = getSingle(list);
            System.out.println(newList);
        }
        public static ArrayList getSingle(List list){
            ArrayList al = new ArrayList();
            Iterator it = list.iterator();
            while(it.hasNext()){
                Object obj = it.next();
                if(!al.contains(obj)){//contains 包含 底层依托的是equals方法 Object类 默认equals方法比较的是地址值
                    al.add(obj);
                }
            }
            return al;
        }
    }


    student类中的contains 包含 底层依托的是equals方法 Object类 默认equals方法比较的是地址值
        //重写 equals方法 比较属性是否相同 (不会看15)
        public boolean equals(Object obj){
            if(!(obj instanceof Student)){
                return false;
            }
            Student stu = (Student)obj;
            return this.name.equals(stu.name) && this.age == stu.age;
        }

    List集合特有的迭代器ListIterator
                hasNext()
                next()
                注意 指针 先向后移动 再移动回来 单独写previous 获取不到数据 必须
                            先将指针向后移动 才能向前移动
                hasPrevious()
                previous()
            //List集合特有的迭代器 ListIterator
            List list = new ArrayList();
            list.add(new Student("张三", 23));
            list.add(new Student("李四", 24));
            list.add(new Student("王五", 25));
            for(int i=0;i<list.size();i++){
                Student stu = (Student)list.get(i);
                System.out.println(stu.getName()+",,,"+stu.getAge());
            }
            //ListIterator
            ListIterator it = list.listIterator();
            while(it.hasNext()){
                Student stu = (Student)it.next();
                System.out.println("ListIterator::::"+stu.getName());
                if("张三".equals(stu.getName())){
                    it.add(new Student("赵四", 44));
                }
            }
            System.out.println(list);
            //注意 指针 先向后移动 再移动回来 单独写previous 获取不到数据 必须 先将指针向后移动 才能向前移动
            while(it.hasPrevious()){
                System.out.println("结果:"+it.previous());
            }
        }
    Vector
            Vector集合 底层是数组
            Vector 和 ArrayList使用方法一样
            遍历方式不同
                Enumeration<E> elements()
                枚举遍历 只能是Vector使用 高版本的List集合无法使用
                实际开发中 使用近乎都是ArrayList
                  public static void main(String[] args) {
            Vector v = new Vector();
            v.addElement("c");
            v.addElement("b");
            v.addElement("a");
            System.out.println(v);
            /*
             * 遍历集合 方式 使用枚举遍历
             * */
            Enumeration en = v.elements();
            while(en.hasMoreElements()){
                System.out.println(en.nextElement());
            }
        }

        Set        
                 排序(升序) 按照自然顺序排序 ASCII码表的顺序排序
                 TreeSet集合 如何给自定义数据类型进行排序?
                第一种方式====我是方法===========
                    让自定义类 实现 public interface Comparable<T>接口
                    此接口强行对实现它的每个类的对象进行整体排序。
                    这种排序被称为类的自然排序,
                    类的 compareTo 方法被称为它的自然比较方法。
                    /*
                     * 返回:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象
                     * 此对象 小于 指定对象 返回 负整数
                     * 此对象 等于 指定对象 返回 0
                     * 此对象 大于 指定对象 返回正整数
                     * */========我是方法==============
                public int compareTo(Object o) {
            // 此对象 this  和  指定对象Object进行比较 按照年龄排序
            /*
             * 返回:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象
             * 此对象 小于 指定对象 返回 负整数
             * 此对象 等于 指定对象 返回 0
             * 此对象 大于 指定对象 返回正整数
             * */
            Teacher t = (Teacher)o;//向下转型
            //System.out.println(this.getAge()+","+this.getName()+",,"+t.getAge()+".."+t.getName());
            if(this.getAge() < t.getAge()){
                return -1;
            }
            if(this.getAge() == t.getAge()){
                //equals
                //String 类的 compareTo方法
                //如果参数字符串等于此字符串,则返回值 0;
                //如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值;
                //如果此字符串按字典顺序大于字符串参数,则返回一个大于 0 的值。
                return this.getName().compareTo(t.getName());
                //return 0;
            }
            return 1;

    第二种方式=======我是方法================
                    让容器具备比较性
                    在创建TreeSet集合的同时 传入public interface Comparator<T>接口
                    重写 compare方法
                    强行对某个对象 collection 进行整体排序 的比较函数。
                    /*
                     * 参数:
                        o1 - 要比较的第一个对象。
                        o2 - 要比较的第二个对象。
                        返回:
                        根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
                            第一个参数 小于 第二个参数 返回 负整数
                            第一个参数 等于 第二个参数 返回 0
                            第一个参数 大于 第二个参数 返回 正整数

                  =============我是方法=====================

  • 相关阅读:
    雪花算法 适用于ID 自增
    SB ,mybatis generator 插件 实现 更新操作
    spark优化
    Hive的导入导出方式汇总
    推荐系统架构图
    DBScan算法
    机器学习-逻辑回归算法
    机器学习-微博精准营销
    机器学习-TF-IDF算法
    机器学习-KNN识别手写数字
  • 原文地址:https://www.cnblogs.com/wanghuaying/p/9445821.html
Copyright © 2011-2022 走看看