0
点赞
收藏
分享

微信扫一扫

20220409java第二阶段------集合

程序员伟杰 2022-04-13 阅读 53

集合框架

什么是集合

java集合框架相关接口

java.until.Collection接口:

Collection下面有两个常见的子接口:

集合方法

 集合的遍历

Collection提供了统一的遍历集合方式:迭代器模式

Iterator iterator()

java.util.Iterator接口

迭代器接口,定义了迭代器遍历集合的相关操作.

不同的集合都实现了一个用于遍历自身元素的迭代器实现类,我们无需记住它们的名字,用多态的角度把他们看做为Iterator即可.

迭代器遍历集合遵循的步骤为:问,取,删.其中删除元素不是必要操作

迭代器的使用:

迭代器要求在遍历过程中不得通过集合的方法增删元素,否则会抛出异常: ConcurrentModificationException,

迭代器的remove方法可以将通过next方法获取的元素从集合中删除,

it.remove();

增强型for循环

泛型

 List集

List集合常见的方法 :

注: 对子集元素的操作就是对原集合对应元素的操作

集合与数组的转换

集合转换为数组

 数组转换为list集合

集合的排序

排序自定义类型元素

实际开发中,我们并不会让我们自己定义的类(如果该类作为集合元素使用)去实现Comparable接口,因为这对我们的程序有侵入性.

侵入性:当我们调用某个API功能时,其要求我们为其修改其他额外的代码,这个现象就是侵入性.侵入性越强的API越不利于程序的后期可维护性.应当尽量避免

重载的Collections.sort(List list,Comparator c)方法

   //匿名内部类的形式创建一个比较器
        Comparator<Point> com = new Comparator<Point>() {
            @Override
            /**
             * 实现比较器接口后必须重写方法compare.
             * 该方法用来定义参数o1与参数o2的比较大小规则
             * 返回值用来表示o1与o2的大小关系
             */
            public int compare(Point o1, Point o2) {
                int len1 = o1.getX() * o1.getX() + o1.getY() * o1.getY();
                int len2 = o2.getX() * o2.getX() + o2.getY() * o2.getY();
                return len1-len2;
            }
        };
        Collections.sort(list,com);//回调模式



        System.out.println(list);

 最终没有侵入性的写法

  Collections.sort(list,(o1,o2)->
                o1.getX() * o1.getX() + o1.getY() * o1.getY() -
                o2.getX() * o2.getX() - o2.getY() * o2.getY()
        );

        System.out.println(list);

 排序字符串

package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortListDemo3 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();

        list.add("传奇");
        list.add("小泽老师");
        list.add("苍老师");
        System.out.println(list);
        
        //按照字符多少排序

      Collections.sort(list,(o1,o2)->o2.length()-o1.length());
        System.out.println(list);
    }
}

Map 

Map常见方法

Map的遍历

public class MapDemo2 {
    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        map.put("语文",99);
        map.put("数学",98);
        map.put("英语",97);
        map.put("物理",96);
        map.put("化学",99);
        System.out.println(map);
        /*
            Set keySet()
            将当前Map中所有的key以一个Set集合形式返回,遍历该集合等同于遍历所有的key
         */
        Set<String> keySet = map.keySet();
        for(String key : keySet){
            System.out.println("key:"+key);
        }

        /*
            Set entrySet()
            将当前Map中每一组键值对以一个Entry实例形式表示,并存入Set集合后返回
            java.util.Map.Entry的每一个实例用于表示Map中的一组键值对,其中方法:
            K getKey():获取对应的key
            V getValue():获取对应的value
         */
        Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
        for(Map.Entry<String,Integer> e : entrySet){
            String key = e.getKey();
            Integer value = e.getValue();
            System.out.println(key+":"+value);
        }

        /*
            Collection values()
            将当前Map中所有的value以一个集合形式返回
         */
        Collection<Integer> values = map.values();
        for(Integer value : values){
            System.out.println("value:"+value);
        }
    }
}

集合和Map都提供了支持使用lambda表达式遍历的操作

public class ForeachDemo {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();
        c.add("one");
        c.add("two");
        c.add("three");
        c.add("four");
        c.add("five");
        System.out.println(c);
        for(String s : c){
            System.out.println(s);
        }

        c.forEach(s->System.out.println(s));
//        c.forEach(System.out::println);


        Map<String,Integer> map = new HashMap<>();
        map.put("语文",99);
        map.put("数学",98);
        map.put("英语",97);
        map.put("物理",96);
        map.put("化学",99);
        System.out.println(map);
//        map.forEach((k,v)-> System.out.println(k+":"+v));

        //1完整代码
//        BiConsumer<String,Integer> action = new BiConsumer<String, Integer>() {
//            public void accept(String k, Integer v) {
//                System.out.println(k+":"+v);
//            }
//        };
//        Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
//        for(Map.Entry<String,Integer> e : entrySet) {
//            String k = e.getKey();
//            Integer v = e.getValue();
//            action.accept(k,v);
//        }

        //2Map的forEache方法的回调写法
//        BiConsumer<String,Integer> action = new BiConsumer<String, Integer>() {
//            public void accept(String k, Integer v) {
//                System.out.println(k+":"+v);
//            }
//        };
//        map.forEach(action);//这个等效上面41-46行(可参考forEach源代码)

        //3使用lambda表达式形式创建
//        BiConsumer<String,Integer> action =(k,v)->System.out.println(k+":"+v);
//        map.forEach(action);

        //4最终写法
        map.forEach((k,v)->System.out.println(k+":"+v));


    }
}
举报

相关推荐

0 条评论