JAVA List容器内部差异化比较工具类(咋个办呢 zgbn)

来源:互联网 发布:怎么查询淘宝授权书 编辑:程序博客网 时间:2024/06/16 13:40

背景:

最近在做一个小项目的时候,遇到需要将两组不同的数据集合进行对比,将相互有差异的元素挑选出来,所以就顺手写了一个工具类,今天发表出来提供给大家参考。

泛型<String>为List<String> l1 和 List<String> l2 两个List容器内部元素对象类型,下面方法只能比较两个List<T>泛型为同一个类型的容器对象。

SortListCmpTools.DiffedLists<String> diffedLists = s.diffSortList(l1, l2, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o1.compareTo(o2);}});


package com.test.list;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.Comparator;import java.util.LinkedList;import java.util.List;/** * 数组、列表差异性比较 *  * @author ChenGang */public class SortListCmpTools {private static final int EID_1 = 1;private static final int EID_2 = 2;/** * 测试方法 * @param args */public static void main(String[] args) {SortListCmpTools s = new SortListCmpTools();List<String> l1 = new ArrayList<String>();List<String> l2 = new ArrayList<String>();l1.add("1211111111111");l1.add("1311111111111");l1.add("1411111111111");l1.add("1511111111111");l1.add("1611111111111");l1.add("1131111111111");l1.add("1121111111111");l1.add("1113111111111");l1.add("1113111111112");l1.add("1113111111122");l1.add("1113111141122");l2.add("1211111111111");l2.add("1311111111111");l2.add("1411111111111");l2.add("1511111111111");l2.add("1611111111111");l2.add("1131111161111");l2.add("1121111111111");l2.add("1113111111111");l2.add("1113111111111");SortListCmpTools.DiffedLists<String> diffedLists = s.diffSortList(l1, l2, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o1.compareTo(o2);}});for (CmpE<String> e : diffedLists.getListA()) {System.out.println(String.format("ID:%d\t IDX:%d\t E:%s\t F:%s", e.getY(), e.getIdx(), e.getE(), String.valueOf(e.isFlag())));}for (CmpE<String> e : diffedLists.getListB()) {System.out.println(String.format("ID:%d\t IDX:%d\t E:%s\t F:%s", e.getY(), e.getIdx(), e.getE(), String.valueOf(e.isFlag())));}}public class CmpE<T> {private T e;private int idx;int y;private boolean flag;public CmpE(T e, int idx, int y) {this.e = e;this.idx = idx;this.y = y;this.flag = true;}public final int getY() {return y;}public final void setY(int y) {this.y = y;}public final boolean isFlag() {return flag;}public final void setFlag(boolean flag) {this.flag = flag;}public final T getE() {return e;}public final int getIdx() {return idx;}}public class DiffedLists<T> {private List<CmpE<T>> listA;private List<CmpE<T>> listB;private Comparator<CmpE<T>> cmptor = new Comparator<SortListCmpTools.CmpE<T>>() {@Overridepublic int compare(CmpE<T> o1, CmpE<T> o2) {return o1.getIdx() - o2.getIdx();}};DiffedLists(List<CmpE<T>> listA, List<CmpE<T>> listB) {this.listA = listA;this.listB = listB;}public final List<CmpE<T>> getListA() {Collections.sort(this.listA, this.cmptor);return listA;}public final List<CmpE<T>> getListB() {return listB;}public final List<CmpE<T>> getSortListA() {return listA;}public final List<CmpE<T>> getSortListB() {return listB;}public final List<CmpE<T>> getSortListA(Comparator<CmpE<T>> cmptor) {Collections.sort(this.listA, cmptor);return listA;}public final List<CmpE<T>> getSortListB(Comparator<CmpE<T>> cmptor) {Collections.sort(this.listA, cmptor);return listB;}}public <T> DiffedLists<T> diffSortList(T[] t1, T[] t2, final Comparator<T> comparator) {List<T> list1 = Arrays.asList(t1);List<T> list2 = Arrays.asList(t2);return this.diffSortList(list1, list2, comparator);}public <T> DiffedLists<T> diffSortList(List<T> list1, List<T> list2, final Comparator<T> comparator) {int len1 = list1.size();int len2 = list2.size();List<CmpE<T>> list = new LinkedList<CmpE<T>>();for (int i = 0; i < len1; i++) {list.add(new CmpE<T>(list1.get(i), i, EID_1));}for (int i = 0; i < len2; i++) {list.add(new CmpE<T>(list2.get(i), i, EID_2));}Collections.sort(list, new Comparator<CmpE<T>>() {@Overridepublic int compare(CmpE<T> o1, CmpE<T> o2) {int f1 = comparator.compare(o1.getE(), o2.getE());int f2 = o1.getIdx() - o2.getIdx();return f1 == 0 ? f2 : f1;}});List<CmpE<T>> elist1 = new LinkedList<CmpE<T>>();List<CmpE<T>> elist2 = new LinkedList<CmpE<T>>();int len = list.size();for (int i = 0; i < len - 1;) {int ii = i + 1;CmpE<T> e1 = list.get(i);CmpE<T> e2 = list.get(ii);if (e1.getY() < e2.getY()) {boolean f = comparator.compare(e1.getE(), e2.getE()) == 0;e1.setFlag(f);e2.setFlag(f);if (e1.getY() == EID_1) {elist1.add(e1);}if (e1.getY() == EID_2) {elist2.add(e1);}if (e2.getY() == EID_1) {elist1.add(e2);}if (e2.getY() == EID_2) {elist2.add(e2);}i = i + 2;} else {e1.setFlag(false);if (e1.getY() == EID_1) {elist1.add(e1);}if (e1.getY() == EID_2) {elist2.add(e1);}i = i + 1;}}return new DiffedLists<T>(elist1, elist2);}}


1 0