裴大头-秦可爱

裴大头-秦可爱

Java 中对 List 去重排序

发表于 2022-12-26
裴大头
阅读量 661
更新于 2022-12-26

一、Java中List集合去除重复数据的五种方法:

1、通过HashSet踢除重复元素

HashSet h = new HashSet(list);
list.clear();
list.addAll(h);

2、删除ArrayList中重复元素,保持顺序

Set set = new HashSet();
List newList = new ArrayList();
for (Iterator iter = list.iterator(); iter.hasNext();) {
Object element = iter.next();
if (set.add(element))
newList.add(element);
}
list.clear();
list.addAll(newList);
System.out.println( " remove duplicate " + list);

3、把list里的对象遍历一遍,用list.contains()判断是否存在,如果不存在就放入到另外一个list集合中

List listTemp=new ArrayList();
for(int i=0;i<list.size();i++){
if(!listTemp.contains(list.get(i))){
listTemp.add(list.get(i));
}
}

4、retainAll和retainAll用法

List<String> a = Arrays.asList ("a", "f", "e", "x", "w");
List<String> b = Arrays.asList ("a", "b", "c", "d");
List<String> c = new List<>();
List<String> d = new List<>();
c = new ArrayList(a);
// 得到a, b 的交集。
c.retainAll(b);
d = new ArrayList(a);
// 合并a, b 值到d 中。
d.addAll(b);
// 去掉交集 c 中的所有条目。留下只出现在a b 中的条目。
d.removeAll(c);
System.out.println(d);

5、用JDK1.8 Stream中对List进行去重:list.stream().distinct();

List<String> a = new ArrayList<> ();
a.add("a");
a.add("b");
a.add("b");
List<String> b = new ArrayList<> ();
b.add("a");
b.add("c");
b.add("b");
a.addAll(b);
List list=(List) a.stream().distinct().collect(Collectors.toList());
System.out.println(list);

二、Java中对List集合排序的三种方法:

按照本文设计的场景,我们创建一个包含了用户列表的 List 集合,并按用户的年龄从大到小进行排序:

1、使用 Comparable 排序

/**
* @author by PHY
* @classname ListSortExample2
* @date 2022/12/26 16:02
* @description: 描述
*/
public class ListSortExample {
public static void main(String[] args) {
// 创建并初始化 List
List<Person> list = new ArrayList<Person>() {{
add(new Person(1, 30, "北京"));
add(new Person(2, 20, "西安"));
add(new Person(3, 40, "上海"));
}};
// 使用 Comparable 自定的规则进行排序
Collections.sort(list);
// 打印 list 集合
list.forEach(p -> {
System.out.println(p);
});
}
}

// 以下 set/get/toString 使用的是 lombok 的注解
@Getter
@Setter
@ToString
class Person implements Comparable<Person> {
private int id;
private int age;
private String name;

public Person(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}

@Override
public int compareTo(Person p) {
return p.getAge() - this.getAge();
}
}

以上代码的执行结果,如下图所示:

核心代码如下:

2、使用 Comparator 排序

Comparable 是类内部的比较方法,而 Comparator 是排序类外部的比较器。使用 Comparator 比较器,无需修改原 Person 类,只需要扩充一个 Person 类的比较器就行了,Comparator 的实现方法有以下两种:

  • 新建 Comparator 比较器;
  • 使用 Comparator 匿名类比较器。

其中,第二种实现方法要更简洁一些,我们通过下面的具体代码,来观察一下二者的区别。

 

2.1、新建 Comparator 比较器

/**
* @author by PHY
* @classname ListSortExample2
* @date 2022/12/26 16:02
* @description: 描述
*/
public class ListSortExample2 {
public static void main(String[] args) {
// 创建并初始化 List
List<Person> list = new ArrayList<Person>() {{
add(new Person(1, 30, "北京"));
add(new Person(2, 20, "西安"));
add(new Person(3, 40, "上海"));
}};
// 使用 Comparator 比较器排序
Collections.sort(list, new PersonComparator());
// 打印 list 集合
list.forEach(p -> {
System.out.println(p);
});
}
}
/**
* 新建 Person 比较器
*/
class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p2.getAge() - p1.getAge();
}
}
@Getter
@Setter
@ToString
class Person {
private int id;
private int age;
private String name;

public Person(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
}

以上代码的执行结果,如下图所示:

本方法的核心实现代码如下:

2.2、匿名类比较器

比较器 Comparator 可以使用更简洁的匿名类的方式,来实现排序功能,具体实现代码如下:

/**
* @author by PHY
* @classname ListSortExample2
* @date 2022/12/26 16:02
* @description: 描述
*/
public class ListSortExample2 {
public static void main(String[] args) {
// 创建并初始化 List
List<Person> list = new ArrayList<Person>() {{
add(new Person(1, 30, "北京"));
add(new Person(2, 20, "西安"));
add(new Person(3, 40, "上海"));
}};
// 使用匿名比较器排序
Collections.sort(list, new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return p2.getAge() - p1.getAge();
}
});
// 打印 list 集合
list.forEach(p -> {
System.out.println(p);
});
}
}
@Getter
@Setter
@ToString
class Person {
private int id;
private int age;
private String name;
public Person(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
}

以上代码的执行结果,如下图所示:

3、使用 Stream 流排序

在 JDK 8 之后可以使用更加简单的方法 Stream 流来实现排序功能,它的实现只需要一行代码,具体实现如下:

/**
* @author by PHY
* @classname ListSortExample3
* @date 2022/12/26 16:02
* @description: 描述
*/
public class ListSortExample3 {
public static void main(String[] args) {
// 创建并初始化 List
List<Person> list = new ArrayList<Person>() {{
add(new Person(1, 30, "北京"));
add(new Person(2, 20, "西安"));
add(new Person(3, 40, "上海"));
}};
// 使用 Stream 排序
list = list.stream().sorted(Comparator.comparing(Person::getAge).reversed())
.collect(Collectors.toList());
// 打印 list 集合
list.forEach(p -> {
System.out.println(p);
});
}
@Getter
@Setter
@ToString
static class Person {
private int id;
private int age;
private String name;
public Person(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
}
}

其中 reversed() 表示倒序的意思,如果不使用此方法则是正序。

以上代码的执行结果,如下图所示:

扩展:排序字段为 null

使用 Stream 进行排序时,如果排序的字段出现 null 值就会导致异常发生,具体示例如下:

/**
* @author by PHY
* @classname ListSortExample4
* @date 2022/12/26 16:02
* @description: 描述
*/
public class ListSortExample4 {
public static void main(String[] args) {
// 创建并初始化 List
List<Person> list = new ArrayList<Person>() {{
add(new Person(30, "北京"));
add(new Person(10, "西安"));
add(new Person(40, "上海"));
add(new Person(null, "上海")); // 年龄为 null
}};
// 按照[年龄]正序,但年龄中有一个 null
list = list.stream().sorted(Comparator.comparing(Person::getAge))
.collect(Collectors.toList());
// 打印 list 集合
list.forEach(p -> {
System.out.println(p);
});
}
}
@Getter
@Setter
@ToString
class Person {
private Integer age;
private String name;

public Person(Integer age, String name) {
this.age = age;
this.name = name;
}
}

以上代码的执行结果,如下图所示:

想要解决上述问题,需要给 Comparator.comparing 传递第二个参数:Comparator.nullsXXX,如下代码所示:

/**
* @author by PHY
* @classname ListSortExample4
* @date 2022/12/26 16:02
* @description: 描述
*/
public class ListSortExample4 {
public static void main(String[] args) {
// 创建并初始化 List
List<Person> list = new ArrayList<Person>() {{
add(new Person(30, "北京"));
add(new Person(10, "西安"));
add(new Person(40, "上海"));
add(new Person(null, "上海"));
}};
// 按照[年龄]正序,但年龄中有一个 null
list = list.stream().sorted(Comparator.comparing(Person::getAge,
Comparator.nullsFirst(Integer::compareTo)))
.collect(Collectors.toList());
// 打印 list 集合
list.forEach(p -> {
System.out.println(p);
});
}
}
@Getter
@Setter
@ToString
class Person {
private Integer age;
private String name;

public Person(Integer age, String name) {
this.age = age;
this.name = name;
}
}

Comparator.nullsFirst 表示将排序字段中的 null 值放到集合最前面,如果想要将 null 值放到集合最后面可以使用 Comparator.nullsLast。

以上代码的执行结果,如下图所示:

以上便是这次整理的Java中对List集合五种去重方法和三种排序方法。

 

评论
来发一针见血的评论吧!
表情

快来发表评论吧~

推荐文章
  • JavaScript 的事件循环机制

    1点赞1评论

  • Element UI 级联选择器 el-cascader 实现懒加载和搜索功能

    1点赞0评论

  • Java 23种设计模式——适配器模式(Adapter)

    1点赞0评论

  • Vue项目代码规范

    1点赞1评论

  • Java 23种设计模式——单例模式(Singleton)

    0点赞1评论

Crafted with by Pei你看雪

小破站居然运行了 1048 天访客 26778

© 2023 Pei你看雪鲁ICP备19037910号-2