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
                            第一个参数 大于 第二个参数 返回 正整数

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

  • 相关阅读:
    Windows SDK编程(Delphi版) 之 应用基础,楔子
    一个小问题引发的论证思考
    Delphi 组件开发教程指南(7)继续模拟动画显示控件
    用PyInstaller将python转成可执行文件exe笔记
    使用 .Net Memory Profiler 诊断 .NET 应用内存泄漏(方法与实践)
    Microsof Office SharePoint 2007 工作流开发环境搭建
    How to monitor Web server performance by using counter logs in System Monitor in IIS
    LINQ之Order By
    window 性能监视器
    内存泄露检测工具
  • 原文地址:https://www.cnblogs.com/wanghuaying/p/9445821.html
Copyright © 2011-2022 走看看