c++ list判断是否包含_List<实体>取出某属性相同的实体,你有什么好的方法吗?...

b98f5ac8360bdd1c005e6542f28ffadb.png

对于List你知道哪些操作?

在项目的开发过程中经常要用到list的结构,如何快速的提取出list<实体>中属性的值相同的实体和不同的实体呢?

1、简单的List做交集和差集和并集

先定义两个list:

(1)交集

​List1.retainAll(List2)

(2)差集

​List1.removeAll(list2);

(3) 并集

​List1.removeAll(list2);
List1.addAll(list2);

2、比较 list<实体>中实体中的属性相同和不同的情况

实体类如下:

​
package com.bug.demo.domain;

import lombok.Data;

/**
 * @author: create by bughuang
 * @version: v1.0
 * @description:
 * @date:2020/3/11
 */
@Data
public class PeopleInfo {
    private int id;

    /**
     * 姓名
     */
    private String userName;

    /**
     * 性别
     */
    private String sex;

    /**
     * 年龄
     */
    private String age;

    /**
     * 电话
     */
    private String phone;
}

现在想取出年龄相同的实体组成一个新的实体,年龄不同的组成另外一个实体。

定义两个list<PeopleInfo>并赋值

​List<PeopleInfo> peopleInfoList = new ArrayList<>();
List<PeopleInfo> peopleInfoList1 = new ArrayList<>();

​
for (int i = 1; i < 5000; i++) {
    PeopleInfo peopleInfo = new PeopleInfo();
    peopleInfo.setId(i);
    peopleInfo.setUserName("123456");
    if (i % 2 == 0) {
        peopleInfo.setAge("1");
    } else {
        peopleInfo.setAge("2");
    }
     peopleInfoList.add(peopleInfo);
}
int c = 3;
for (int j = 6000; j < 10000; j++) {
    PeopleInfo peopleInfo = new PeopleInfo();
    peopleInfo.setId(j);
    peopleInfo.setUserName("78910");
    if (j % 2 == 0) {
         peopleInfo.setAge("2");
    } else {
         c= c+1;
         peopleInfo.setAge(String.valueOf(c));
    }

    peopleInfoList1.add(peopleInfo);
}

​

这里故意设置数据量偏大一点,看看运行效率。

(1)先做并集

定义一个peopleInfoList2:

​
List<PeopleInfo> peopleInfoList2 = new ArrayList<>();

​peopleInfoList2.addAll(peopleInfoList);
peopleInfoList2.addAll(peopleInfoList1);

​

(2)定义一个hashmap

利用其中的key 不能重复作为判断条件。

​HashMap<String, PeopleInfo> StudentMap = new HashMap<String, PeopleInfo>();

(3)循环判断

循环peopleInfoList2,取出peopleInfoList2中PeopleInfo 的属性的age作为StudentMap 的key,实体作为value。判断map 中的key 是否已经存在,如果key 不存在:

​StudentMap.put(key, key的value);

并定义一个peopleInfoList3 添加这个实体到其中:

​peopleInfoList3.add(person);

如存在定义一个peopleInfoList4添加这个实体到其中:

​peopleInfoList4.add(person);

3、整体代码如下2

​ public List<PeopleInfo> Test() {
     List<PeopleInfo> peopleInfoList = new ArrayList<>();
     List<PeopleInfo> peopleInfoList1 = new ArrayList<>();
     List<PeopleInfo> peopleInfoList2 = new ArrayList<>();
     for (int i = 1; i < 5000; i++) {
         PeopleInfo peopleInfo = new PeopleInfo();
         peopleInfo.setId(i);
         peopleInfo.setUserName("123456");
         if (i % 2 == 0) {
             peopleInfo.setAge("1");
         } else {
             peopleInfo.setAge("2");
         }
         peopleInfoList.add(peopleInfo);
      }
      int c = 3;
      for (int j = 6000; j < 10000; j++) {
          PeopleInfo peopleInfo = new PeopleInfo();
          peopleInfo.setId(j);
          peopleInfo.setUserName("78910");
          if (j % 2 == 0) {
              peopleInfo.setAge("2");
          } else {
              c= c+1;
              peopleInfo.setAge(String.valueOf(c));
          }

          peopleInfoList1.add(peopleInfo);
      }
      System.out.println("b" + peopleInfoList1);
      //以上是定义List下面才是找出相同和不同属性的实体
      peopleInfoList2.addAll(peopleInfoList);
      peopleInfoList2.addAll(peopleInfoList1);
      List<PeopleInfo> peopleInfoList3 = new ArrayList<>();
      List<PeopleInfo> peopleInfoList4 = new ArrayList<>();
      HashMap<String, PeopleInfo> StudentMap = new HashMap<String, PeopleInfo>();
      for (PeopleInfo person : peopleInfoList2) {
          if (StudentMap.get(person.getAge()) == null) {
              StudentMap.put(person.getAge(), person);
              peopleInfoList3.add(person);
          } else {
              peopleInfoList4.add(person);
          }
      }
      return peopleInfoList3;
  }

​

核心就是用hashmap的key 不能重复作为判断条件。

你们有什么更好的办法吗?可以在下面评论哦,互相进步啊。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值