- 业务有用到,然后参考了归并排序写了这个工具
适合大数据量,因为不需要map辅助,省内存,入参只能是两个已经去重的列表,然后可以得到两个列表独有以及共有的部分
/**
* 列表异同 , 参考了归并排序
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DiffBetweenTwoList<T> {
/**
* 左边独有
*/
List<T> leftOnly;
/**
* 共有
*/
List<T> comm;
/**
* 右边独有
*/
List<T> rightOnly;
/**
* 大数据量用这个省内存
*
* @param left 左
* @param right 右
* @param comparator 比较器
* @return {@link Map}<{@link Integer}, {@link List}<{@link T}>>
*/
public static <T> DiffBetweenTwoList<T> getDiffFromTwoList(List<T> left, List<T> right, Comparator<T> comparator) {
DiffBetweenTwoList<T> res = new DiffBetweenTwoList<>();
List<T> onlyLeft = new ArrayList<>();
List<T> onlyRight = new ArrayList<>();
List<T> equals = new ArrayList<>();
left.sort(comparator);
right.sort(comparator);
int leftSize = left.size();
int rightSize = right.size();
int i = 0, j = 0;
while (i < leftSize || j < rightSize) {
if (j >= rightSize) {
while (i < leftSize) {
onlyLeft.add(left.get(i));
i++;
}
}
if (i >= leftSize) {
while (j < rightSize) {
onlyRight.add(right.get(j));
j++;
}
}
while (i < leftSize && comparator.compare(left.get(i), right.get(j)) < 0) {
onlyLeft.add(left.get(i));
i++;
}
while (i < leftSize && j < rightSize && comparator.compare(left.get(i), right.get(j)) > 0) {
onlyRight.add(right.get(j));
j++;
}
while (i < leftSize && j < rightSize && comparator.compare(left.get(i), right.get(j)) == 0) {
equals.add(left.get(i));
i++;
j++;
}
}
res.setLeftOnly(onlyLeft);
res.setComm(equals);
res.setRightOnly(onlyRight);
return res;
}
}