比较两个集合是否完全一样
使用常规的集合比较方法无法处理集合中存在相同元素时的处理,此比较其支持此种情况,大致算法为:
- 遍历两个集合逐个比较,
- 相同遇到相同的,从两个集合中同时删除(删除备份的,不删原始集合),
- 遍历完成后两个集合无剩余元素时即相同,否则不同。
具体代码如下
// 集合中原始相同的判定接口
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);
}
}