List高效remove方法,自定义比较字段后remove

本文提供了一种方法来移除两个列表之间的重复项,并且针对具体字段进行了优化处理。通过集合和映射来提高查找效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:
两个相同对象的list,需要将两个list的公共数据从第一个list中去掉。


/**
 * 将两个list中公共的数据从source list中去掉;
 *
 * @param source      list1
 * @param destination list2
 * @return list1 - (list1 ∩ list2);
 */
public List<T> removeAll(List<T> source, List<T> destination) {
    List<T> result = new LinkedList<T>();
    Set<T> destinationSet = new HashSet<>(destination);
    for (T t : source) {
        if (!destinationSet.contains(t)) {
            result.add(t);
        }
    }
    return result;
}

/**
 * 将两个listfiled字段相同的数据从source list中去掉
 *
 * @param source      list1
 * @param destination list2
 * @param field
 * @return
 */
public List<T> removeAll(List<T> source, List<T> destination, E field) {
    List<T> result = new LinkedList<>();
    Map<E, T> destinationMap = new HashMap<E, T>();
    Method m =null;
    try {
        for (T t : destination) {
            m = t.getClass().getMethod("get"+getMethodName((String)field));
            destinationMap.put((E)m.invoke(t), t);
        }
        for (T t : source) {
            if (!destinationMap.containsKey((E)m.invoke(t))) {
                result.add(t);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}

/**
 * 获取方法名称
 * @param field
 * @return
 * @throws Exception
 */
private String getMethodName(String field) throws Exception{
    byte[] items = field.getBytes();
    items[0] = (byte)((char)items[0] - 'a' + 'A');
    return new String(items);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值