当前位置:   article > 正文

Java容器常见操作_java 容器 去重

java 容器 去重
一、针对List常见操作

1. List集合转数组

List集合中提供toArray方法,toArray有两个重载的方法:

  • list.toArray(),将list直接转为Object[] 数组;
  • list.toArray(T[] a),将list转化为你所需要类型的数组,但注意要和list数据类型一致。

list集合转数组

2. 判断List集合中是否存在某个字符串

使用 java.util.List.contains(Object)

  • list中接口方法contains
boolean contains(Object o);
  • 1
  • ArrayList中接口方法的实现
public boolean contains(Object o) {
    return indexOf(o) >= 0;
}
  • 1
  • 2
  • 3
  • indexof方法
public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = 0; i < size; i++)
            if (o.equals(elementData[i]))
                return i;
    }
    return -1;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

一般情况下我们没有重写equals()方法,这时就会调用继承自object类的equals()方法,而object的equals()方法,实际就是 ==,对于引用数据类型而言,==比较的是内存地址。

public boolean equals(Object obj) {
   return (this == obj);
}
  • 1
  • 2
  • 3

所以对于一个对象而言,用contains判断List<Pojo>是否存在某一个对象是不行的,除非重写equals()方法,像List<String>,String类重写了equals()方法,比较的是对象的内容。
判断List集合中是否有某个字符串或整数

3. 针对ArrayList自定义排序的2种实现方法

  • 1)让需要进行排序的对象的类实现Comparable接口,重写compareTo(To)方法,在其中定义排序规则,然后就可以直接调用Collections.sort()来排序对象数组。
public class Student implements Comparable{
   ......
    @Override
    public int compareTo(Object o) {
      ......
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
public class Test {
    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student(1, "A", 20, 180));
        list.add(new Student(2, "B", 21, 175));
        list.add(new Student(3, "C", 22, 190));
        list.add(new Student(4, "D", 21, 170));

        Collections.sort(list);
		......
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 2)实现比较器接口Comparator,重写compare方法,直接当做参数传进sort中。
public class Test {

    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student(1, "A", 20, 180));
        list.add(new Student(2, "B", 21, 175));
        list.add(new Student(3, "C", 22, 190));
        list.add(new Student(4, "D", 21, 170));
        list.add(new Student(5, "E", 20, 185));
        
        Collections.sort(list, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                if(o1.getAge() >= o2.getAge()) {
                    return 1;
                }
                else {
                    return -1;
                }
            }
        });
       ......
    }
   
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

4. List集合去重

// 创建一个ArrayList 包含两个相同元素"111"
List<String> list = new ArrayList<String>();
list.add("111");
list.add("111");
list.add("222");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 使用Set集合特性
// 创建HashSet集合
Set set = new HashSet();
set.addAll(list);     // 将list所有元素添加到set中    set集合特性会自动去重复
list.clear();
list.addAll(set);    // 将list清空并将set中的所有元素添加到list中
  • 1
  • 2
  • 3
  • 4
  • 5
  • 使用java8 stream api
// Collectors.toList方法是获取list类型的收集器  distinct方法进行去重  collect进行转换
// list2就是去重后得到的结果,可以看出java8的stream api使用很方便。
List<Object> list2 = list.stream().distinct().collect(Collectors.toList());
  • 1
  • 2
  • 3

5. List集合如何遍历时删除数据?

  • 使用官方推荐的Iterator迭代器提供的Iterator.remove方法在遍历集合时删除集合元素;
  • 使用Java 8新增的removeIf方法在遍历集合时删除集合元素。
/**
 * 使用Iterator的方式也可以顺利删除和遍历,不会有任何问题,这才是删除变量List中元素的正确方式
 */
public static void iteratorRemove() {
    List<Student> list = new ArrayList<>();
    for (int i = 1; i <= LIST_SIZE; i++) {
        list.add(new Student(i, "Student" + i));
    }

    Iterator<Student> iterator = list.iterator();
    long millionSeconds = System.currentTimeMillis();
    while (iterator.hasNext()) {
        Student student = iterator.next();
        if (student.getId() % CONDITION_NUM == 0) {
            iterator.remove();
        }
    }
    System.out.println("iteratorRemove操作耗时:" + (System.currentTimeMillis() - millionSeconds));
}

/**
 * 也可以使用Java 8新增的removeIf方法在遍历时删除List中的元素,该方法也使用Iterator了,所以删除是安全的
 */
public static void ifRemove() {
    List<Student> list = new ArrayList<>();
    for (int i = 1; i <= LIST_SIZE; i++) {
        list.add(new Student(i, "Student" + i));
    }

    long millionSeconds = System.currentTimeMillis();
    list.removeIf(student -> student.getId() % CONDITION_NUM == 0);
    System.out.println("ifRemove操作耗时:" + (System.currentTimeMillis() - millionSeconds));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/77323
推荐阅读
相关标签
  

闽ICP备14008679号