集合是否相等的判定器

37 篇文章 0 订阅
10 篇文章 0 订阅

比较两个集合是否完全一样

​ 使用常规的集合比较方法无法处理集合中存在相同元素时的处理,此比较其支持此种情况,大致算法为:

  1. 遍历两个集合逐个比较,
  2. 相同遇到相同的,从两个集合中同时删除(删除备份的,不删原始集合),
  3. 遍历完成后两个集合无剩余元素时即相同,否则不同。

具体代码如下

// 集合中原始相同的判定接口
public interface ItemEqualityDecider<T> {
    boolean isEq(T t1,T t2);
}
// 判断器
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

public class CollectionEqualityDecider<T> {

    private Collection<T> collection1;
    private Collection<T> collection2;
    private ItemEqualityDecider equalityDecider;

    public CollectionEqualityDecider(Collection<T> collection1, Collection<T> collection2, ItemEqualityDecider<T> equalityDecider) {
        this.collection1 = collection1;
        this.collection2 = collection2;
        this.equalityDecider = equalityDecider;
    }

    public boolean isEq(){
        if(this.collection1.size() != this.collection1.size()){
            // 元素的数量不一样,则直接返回不相等.
            return false;
        }
        // 备份原始集合
        Collection<T> collection1Tmp = new ArrayList<>();
        Collection<T> collection2Tmp = new ArrayList<>();
        collection1Tmp.addAll(this.collection1);
        collection2Tmp.addAll(this.collection2);
        // 逐个比较并删除备份集合中的元素。
        for(T t1:this.collection1){
            T eqT = getEqItem(t1,collection2Tmp);
            if(eqT != null){
                collection1Tmp.remove(t1);
                collection2Tmp.remove(eqT);
            }
        }
        // 判断剩余元素,都为空则相同,否则不同
        return collection1Tmp.isEmpty()  && collection2Tmp.isEmpty();
    }

    private  T getEqItem(T t1, Collection<T> collection2Tmp){
        // 使用equalityDecide比较元素是否在另外一个集合中存在相同的元素,存在则返回另外一个集合中对应的元素
        List<T> eqItemList = collection2Tmp.stream().filter(t2 -> {
            return equalityDecider.isEq(t1,t2);
        }).collect(Collectors.toList());
        return eqItemList == null || eqItemList.isEmpty() ? null : eqItemList.get(0);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜗牛_snail

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值