如何对List去重,含Java8写法

一、去除List中重复的String

public class StringDp {
    public static void main(String[] args) {
        //正常普通写法
        List<String> list=new ArrayList<>();
        list.add("迪丽热巴");
        list.add("古力娜扎");
        list.add("马尔扎哈");
        list.add("迪丽热巴");
        list.add("马尔扎哈");
        System.out.println(list);
        System.out.println("去重后:"+removeListStringDp(list));
        //Java8写法
        List<String> stringDpList=list.stream().distinct().collect(Collectors.toList());
        System.out.println("JAVA8去重:"+stringDpList);
    }

    public static List<String> removeListStringDp(List<String> list){
        Set<String> set=new LinkedHashSet<>();
        set.addAll(list);
        list.clear();
        list.addAll(set);
        return list;
    }
}

二、去除List中重复的对象\对象属性

//创建一个Person类,给出构造函数,get,set方法
public class Person {
    private String name;
    private int age;
    private String ho;
    .....
    .....
    .....

//重写equals方法和hashcode方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name) &&
                Objects.equals(ho, person.ho);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age, ho);
    }
}

public class ObjectDp {
    public static void main(String[] args) {
        Person p1=new Person("张三",18,"洗澡");
        Person p2=new Person("李四",19,"抽烟");
        Person p3=new Person("王五",20,"电影");
        Person p4=new Person("张三",18,"洗澡");
        Person p5=new Person("王五",18,"洗澡");

        //根据对象去重
        List<Person> persons= Arrays.asList(p1,p2,p3,p4,p5);
        List<Person> personList=new ArrayList<Person>();
        persons.stream().forEach(p->{
            if (!personList.contains(p)) {
                personList.add(p);
            }
        });
        System.out.println("去重前:"+persons);
        System.out.println("去重后:"+personList);

        //根据对象属性去重
        Set<Person> personSet=new TreeSet<Person>((o1, o2) -> o1.getName().compareTo(o2.getName()));
        personSet.addAll(persons);
        System.out.println("属性(名字)去重后:"+personSet);

        //java8根据对象属性去重
        List<Person> unique = persons.stream().collect(
                collectingAndThen(
                        toCollection(() -> new TreeSet<>(comparing(Person::getName))),ArrayList::new));
        System.out.println("Java8属性去重:"+unique);
    }
}

注:去除重复对象是用的contains()方法。出去重复对象属性是用的compareTo()方法。List 的contains()方法底层实现使用对象的equals方法去比较的,其实重写equals()就好,但重写了equals最好将hashCode也重写了。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中有几种方法可以对 List 去重。其中一种方法是使用双重循环来遍历 List,并且比较元素是否相等,如果相等则将重复的元素移除。示例代码如下: public static List removeDuplicate(List list) { for (int i = 0; i < list.size() - 1; i++) { for (int j = list.size() - 1; j > i; j--) { if (list.get(j).equals(list.get(i))) { list.remove(j); } } } return list; } 引用是示例代码,它使用了双重循环的方式来去重。首先,外层循环从第一个元素开始遍历,内层循环从最后一个元素开始遍历,如果内层循环的元素与外层循环的元素相等,则将内层循环的元素移除。最后返回去重后的 List。 另一种方法是创建一个临时的 List,遍历原始的 List,如果临时 List 中不包当前元素,则将当前元素添加到临时 List 中。示例代码如下: public static List removeDuplicate(List list){ List listTemp = new ArrayList(); for(int i=0;i<list.size();i++){ if(!listTemp.contains(list.get(i))){ listTemp.add(list.get(i)); } } return listTemp; } 引用是示例代码,它使用了临时 List 的方式来去重。首先,创建一个空的临时 List,然后遍历原始的 List,对于每个元素,如果临时 List 中不包该元素,则将该元素添加到临时 List 中。最后返回去重后的 List。 这些方法可以根据你的具体需求选择使用,根据 List 的大小和性能要求,选择合适的方法可以提高程序的效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java中对List去重 Stream去重的解决方法](https://download.csdn.net/download/weixin_38667403/12761286)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [JavaList集合去除重复数据的六种方法](https://blog.csdn.net/gb4215287/article/details/122599183)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值