风也温柔

计算机科学知识库

熟练使用java中的集合算法题(一)_

  要想熟练写出算法题,必须熟练使用java中的集合。java中的集合实现了我们可以直接使用的各种数据结构,更多地专注于解决算法问题而不是实现这些数据结构。

  集合主要分为两类,分别是和Map,表示一组对象,Map,表示一组映射关系或键值对。

  下图是它们之间的继承和实现关系:

  在这里插入图片描述

  下图展示了Maps之间的继承和实现关系:

  在这里插入图片描述

  1. 常用函数

  是所有单列集合的父接口,所以定义了一些单列集合通用的方法(List和Set),这些方法可以用来操作所有的单列集合。方法如下:

  1、添加元素

  (1)add(E obj):将元素对象添加到当前集合中。

  (2)(coll):从当前集合中移除所有与coll集合中相同的元素。即this = this - this ∩ coll

  3、判断元素

  (1)():判断当前集合是否为空集合。

  (2) (obj):判断当前集合中是否有元素与obj对象一起返回true。

  (3)(c):判断c集合中的元素是否存在于当前集合中。即c集合是否是当前集合的“子集”。

  4、查询

  (1)int size():获取当前集合中实际存储的元素个数。

  (2)[] ():返回一个包含当前集合中所有元素的数组。

  5、交叉口

  (1) ( coll ):当前集合只保留与c集合中相同的元素,即当前集合中只保留两个集合的交集,即this = this ∩ coll .

  2. 迭代器

  接口主要用于元素的遍历,常用方法如下:

   public class IteratorDemo {

          public static void main(String[] args) {
            // 使用多态方式 创建对象
            Collection coll = new ArrayList();
            // 添加元素到集合
            coll.add("张三");
            coll.add("李四");
            coll.add("王五");
            Iterator it = coll.iterator();
            //  泛型指的是 迭代出 元素的数据类型
            while(it.hasNext()){ //判断是否有迭代元素
                String s = it.next();//获取迭代出的元素
                System.out.println(s);
            }
          }
    }

  注意:使用迭代器迭代时不要调用(xx)方法,否则java.util异常。将被报告,否则将发生未定义的行为。您可以使用迭代器的 () 方法。

  3.列表集合

  List继承自接口,继承了接口中的所有方法,还添加了一些独特的方法来根据元素索引对集合进行操作,如下:

  1、添加元素

  2、获取元素

  3、获取元素索引

  4、移除和替换元素

  列表集合特定的方法与索引相关。

  3.1 个收藏

  实现 List 接口。可以使用和 List 中提供的方法。

  3.2 收藏

  版本比较古老,不支持fail-fast,很少使用。

  3.3 收藏

  链表结构。便于添加和删除元素的集合。该类除了实现List接口外熟练使用java中的集合算法题(一)_,还提供了get的统一命名方法,以及list开头和结尾的元素。这些操作允许将链表用作堆栈、队列或双端队列。

  Deque 接口是在 JDK1.6 之后实现的。双端队列也可以用作 LIFO(后进先出)堆栈。如果要使用堆栈结构的集合,请考虑使用它而不是 Stack。

  stack 方法等价于 Deque 方法

  推(e)

  (e)

  流行音乐()

  ()

  窥视()

  ()

   public static void main(String[] args) {

        LinkedList list = new LinkedList();
        //入栈
        list.addFirst(1);
        list.addFirst(2);
        list.addFirst(3);
        //出栈: LIFO(后进先出)
        System.out.println(list.removeFirst());//3
        System.out.println(list.removeFirst());//2
        System.out.println(list.removeFirst());//1
        //栈空了,会报异常java.util.NoSuchElementException
        System.out.println(list.removeFirst());
    }

  当用作队列时,您将获得 FIFO(先进先出)行为。将元素添加到双端队列的末尾,从双端队列的开头移除元素。

  Queue 方法等价于 Deque 方法

  添加(e)

  (e)

  报价(e)

  (e)

  ()

  ()

  轮询()

  ()

  ()

  ()

  窥视()

  ()

   public static void main(String[] args) {

            LinkedList list = new LinkedList();
            //入队
            list.addLast(1);
            list.addLast(2);
            list.addLast(3);
            
            //出队, FIFO(先进先出)
            System.out.println(list.pollFirst());//1
            System.out.println(list.pollFirst());//2
            System.out.println(list.pollFirst());//3
            //队空了,返回null
            System.out.println(list.pollFirst());//null
        }

  每个方法都以两种形式存在:一种在操作失败时抛出异常,另一种返回特殊值(null 或 false,具体取决于操作)。

  3.4

  List 集合还提供了一个 () 方法,该方法返回一个对象。该接口继承了接口java实现旋转门算法,并提供了具体操作List的方法:

   public static void main(String[] args) {

        List c = new ArrayList();
        c.add("张三");
        c.add("李四");
        c.add("王五");
        //从指定位置往前遍历
        ListIterator listIterator = c.listIterator(c.size());
        while(listIterator.hasPrevious()){
            String previous = listIterator.previous();
            System.out.println(previous);
        }
    }

  4.设置集合

  Set接口是一个子接口,set接口不提供额外的方法。但比接口限制更多的是,Set 集合不允许包含相同的元素。集合集合支持遍历的方式与集合相同:and. Set 的常见实现类有: , , .

  4.1

  它是Set接口的一个典型实现,在使用Set集合的时候大部分时间都会用到这个实现类。java.util 的底层实现。实际上是一个java.util。支持java实现旋转门算法,那么底层的物理实现就是一个Hash表。

  集合中的元素按照Hash算法存储,具有良好的访问和搜索性能。判断集合中两个元素是否相等的标准:两个对象通过()方法比较是否相等,两个对象的()方法返回值也相等。因此,存储到的元素必须覆盖 sum 方法。例如,实现一个需要 name 和相同才能被视为同一员工的类:

   public class Employee {

        private String name;
        private MyDate birthday;
        
        // 这里 构造方法、getter、setter 都省略
        
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((birthday == null) ? 0 : birthday.hashCode());
            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;
            Employee other = (Employee) obj;
            if (birthday == null) {
                if (other.birthday != null)
                    return false;
            } else if (!birthday.equals(other.birthday))
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }
        
        // toString() 这里省略
    }
    public class MyDate {
        private int year;
        private int month;
        private int day;
        
        // 这里 构造方法、getter、setter 都省略
        
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + day;
            result = prime * result + month;
            result = prime * result + year;
            return result;
        }
        
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            MyDate other = (MyDate) obj;
            if (day != other.day)
                return false;
            if (month != other.month)
                return false;
            if (year != other.year)
                return false;
            return true;
        }
        
        // toString() 这里省略
    }

  4.2

  是的,子类在 的基础上,给节点添加了两个属性,之后保持了添加节点前后的顺序。java.util.,是一种结合链表和哈希表的数据存储结构。插入性能略低,但在迭代 Set 中的所有元素时具有良好的性能。

  4.3

  底层结构:内部维护一个,基于红黑树实现。

  特征:

  如何实现去重?

  如何排序?

  下面给出了一个自定义排序的示例:

   public class Student{

        private int id;
        private String name;
        
        // 这里省略了构造方法、getter、setter、toString
    }
    public void test3(){
        TreeSet set = new TreeSet(new Comparator(){
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getId() - o2.getId();
            }
        });
        set.add(new Student(3,"张三"));
        set.add(new Student(1,"李四"));
        set.add(new Student(2,"王五"));
        set.add(new Student(3,"张三凤"));
        System.out.println("元素个数:" + set.size());
        for (Student stu : set) {
            System.out.println(stu);
        }
    }

  5.地图收藏

  Map接口下的集合与接口下的集合不同,它们以不同的形式存储数据。

  Map的常用方法如下:

  1、添加动作

  2、删除

  3、元素查询的操作

  4、元视图操作方法:

  5、其他方法

  Map的遍历可以通过以下方式完成:

   // map.keySet()

    System.out.println("所有的key:");
    Set keySet = map.keySet();
    for (String key : keySet) {
        System.out.println(key);
    }
    // map.values()
    System.out.println("所有的value:");
    Collection values = map.values();
    for (String value : values) {
        System.out.println(value);
    }
    // map.entrySet()
    System.out.println("所有的映射关系");
    Set entrySet = map.entrySet();
    for (Map.Entry entry : entrySet) {
        System.out.println(entry.getKey()+"->"+entry.getValue());
    }

  5.1 和

  Map 接口提供的所有方法都可以使用。

  5.2

  是的子类。此实现与后者的不同之处在于后者维护一个在所有条目上运行的双向链表。这个链表定义了迭代顺序,通常是键插入映射的顺序(插入顺序)。

  5.3

  基于红黑树的实现。映射根据其键的自然顺序或根据创建映射时提供的顺序进行排序,具体取决于使用的构造函数。

   TreeMap map = new TreeMap(new Comparator() {

        @Override
        public int compare(String o1, String o2) {
            return o1.compareToIgnoreCase(o2);
        }
    });

  5.4

  类是可以保存在流中或从流中加载的子类。属性列表中的每个键及其对应的值都是一个字符串。访问数据时,推荐使用(key, value)方法和(key)方法。

  代码示例:

   public static void main(String[] args) {

            Properties properties = System.getProperties();
            String p2 = properties.getProperty("file.encoding");//当前源文件字符编码
            System.out.println(p2);
        }

  6. 工具

  它是一个工具类,用于操作 Set、List 和 Map 等集合。它提供了一系列静态方法对集合元素进行排序、查询和修改,还提供了不可变集合对象和集合对象同步控制的方法:

  文章来源:https://blog.csdn.net/weixin_45545090/article/details/124153967