最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA中DIFF算法實(shí)現(xiàn)

 更新時(shí)間:2023年07月03日 14:46:02   作者:編程路上的wdm  
本文主要介紹了JAVA中DIFF算法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

首先看一下我的文件結(jié)構(gòu)

文件目錄結(jié)構(gòu)

1.EnumType 類

public enum EnumType {
    ADD("ADD"),MODIFIED("MODIFIED"), DELETED("DELETED");
    //創(chuàng)建私有變量
    private String type;
    EnumType(String type) {
        this.type = type;
    }
}

2.OperationType類

public class OperationType {
    private static final EnumType ADD=EnumType.ADD;
    private static final EnumType MODIFIED=EnumType.MODIFIED;
    private static final EnumType REMOVED=EnumType.DELETED;
}

3.DiffListUtil類

public class DiffListUtil {
? ? @Data
? ? public static class TargetWrapper<T> {
? ? ? ? private T target;
? ? ? ? private EnumType type;
? ? ? ? public TargetWrapper(T target, EnumType type) {
? ? ? ? ? ? this.target = target;
? ? ? ? ? ? this.type = type;
? ? ? ? }
? ? ? ? // Getters and setters for target and type
? ? }
? ? @Data
? ? @Accessors(chain = true)
? ? public static class DiffResult<T> {
? ? ? ? private List<TargetWrapper<T>> allList;
? ? ? ? /**
? ? ? ? ?* 新增對象列表
? ? ? ? ?*/
? ? ? ? private List<TargetWrapper<T>> addedList;
? ? ? ? /**
? ? ? ? ?* 修改后的對象列表
? ? ? ? ?*/
? ? ? ? private List<TargetWrapper<T>> changedList;
? ? ? ? /**
? ? ? ? ?* 已刪除對象列表
? ? ? ? ?*/
? ? ? ? private List<TargetWrapper<T>> deletedList;
? ? }
? ? /**
? ? ?* 對比兩個List的元素
? ? ?* <p>
? ? ?* 如果 baseList 的元素在 targetList 中存在 PrimaryKey 相等的元素并且 elementComparator 比較結(jié)果不相等,則將修改后的值添加到changedList列表中;
? ? ?* 如果 baseList 的元素在 targetList 中不存在,將baseList中的元素添加到deletedList中;
? ? ?* 如果 targetList 的元素在 baseList 中不存在,將targetList中的元素添加到addedList中;
? ? ?* <p>
? ? ?* complexity: O(n)
? ? ?*
? ? ?* @param baseList ? ? ? ? ? ?基礎(chǔ)List(原來的List)
? ? ?* @param targetList ? ? ? ? ?目標(biāo)List(最新的List)
? ? ?* @param elementComparator ? 元素比較器
? ? ?*primaryKeyExtractor
? ? ?* @param <T>
? ? ?* @return 對比結(jié)果
? ? ?*/
? ? public static <T> DiffResult<T> diffList(List<T> baseList,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?List<T> targetList,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@NotNull Function<T, Object> primaryKeyExtractor,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@NotNull Comparator<T> elementComparator) {
? ? ? ? DiffResult<T> checkResult = checkEmptyAndReturn(baseList, targetList);
? ? ? ? if (checkResult != null) {
? ? ? ? ? ? return checkResult;
? ? ? ? }
? ? ? ? Map<Object,T> baseMap = new HashMap<>(4096);
? ? ? ? for(T base : baseList){
? ? ? ? ? ? Object key = primaryKeyExtractor.apply(base);
? ? ? ? ? ? baseMap.put(key,base);
? ? ? ? }
? ? ? ? List<TargetWrapper<T>> addedList = new ArrayList<>();
? ? ? ? List<TargetWrapper<T>> changedList = new ArrayList<>();
? ? ? ? List<TargetWrapper<T>> deletedList = new ArrayList<>();
? ? ? ? List<TargetWrapper<T>> allList = new ArrayList<>();
? ? ? ? //找出新增的 和需要更新的
? ? ? ? for (T target : targetList) {
? ? ? ? ? ? Object key = primaryKeyExtractor.apply(target);
? ? ? ? ? ? T base = baseMap.get(key);
? ? ? ? ? ? if(base == null){
? ? ? ? ? ? ? ? addedList.add(new TargetWrapper<T>(target, EnumType.ADD));
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? baseMap.remove(key);
? ? ? ? ? ? ? ? if (elementComparator.compare(base, target) != 0) {
? ? ? ? ? ? ? ? ? ? changedList.add(new TargetWrapper<T>(target, EnumType.MODIFIED));
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //剩余的就是需要刪除的
? ? ? ? Set<Map.Entry<Object, T>> entrySet = baseMap.entrySet();
? ? ? ? if(CollUtil.isNotEmpty(entrySet)){
? ? ? ? ? ? for(Map.Entry<Object, T> entry:entrySet){
? ? ? ? ? ? ? ? deletedList.add(new TargetWrapper<T>(entry.getValue(), EnumType.DELETED));
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? allList.addAll(addedList);
? ? ? ? addedList.addAll(changedList);
? ? ? ? addedList.addAll(deletedList);
? ? ? ? return new DiffResult<T>()
? ? ? ? ? ? ? ? .setAddedList(addedList)
? ? ? ? ? ? ? ? .setChangedList(changedList)
? ? ? ? ? ? ? ? .setDeletedList(deletedList)
? ? ? ? ? ? ? ? .setAllList(allList);
? ? }
? ? private static <T, V> void setFieldValue(T object, Function<? super T,V> fieldGetter, String value) {
? ? ? ? try {
? ? ? ? ? ? Field field = fieldGetter.getClass().getDeclaredField("value");
? ? ? ? ? ? field.setAccessible(true);
? ? ? ? ? ? field.set(fieldGetter.apply(object), value);
? ? ? ? } catch (NoSuchFieldException | IllegalAccessException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ? /**
? ? ?* 檢查baseList 和 targetList 為empty(null||size==0)的情況
? ? ?*
? ? ?* @param baseList
? ? ?* @param targetList
? ? ?* @param <T>
? ? ?* @return
? ? ?*/
? ? private static <T> DiffResult<T> checkEmptyAndReturn(List<T> baseList, List<T> targetList) {
? ? ? ? if (CollUtil.isEmpty(baseList) && CollUtil.isEmpty(targetList)) {
? ? ? ? ? ? return new DiffResult<T>()
? ? ? ? ? ? ? ? ? ? .setAddedList(null)
? ? ? ? ? ? ? ? ? ? .setChangedList(null)
? ? ? ? ? ? ? ? ? ? .setDeletedList(null);
? ? ? ? }
? ? ? ? if (CollUtil.isEmpty(baseList) && CollUtil.isNotEmpty(targetList)) {
? ? ? ? ? ? List<TargetWrapper<T>> wrapperTargetList = targetList.stream().map(t -> new TargetWrapper<>(t, EnumType.DELETED)).collect(Collectors.toList());
? ? ? ? ? ? return new DiffResult<T>()
? ? ? ? ? ? ? ? ? ? .setAddedList(wrapperTargetList)
? ? ? ? ? ? ? ? ? ? .setChangedList(null)
? ? ? ? ? ? ? ? ? ? .setDeletedList(null);
? ? ? ? }
? ? ? ? if (CollUtil.isNotEmpty(baseList) && CollUtil.isEmpty(targetList)) {
? ? ? ? ? ? List<TargetWrapper<T>> wrapperBaseList = baseList.stream().map(t -> new TargetWrapper<>(t, EnumType.DELETED)).collect(Collectors.toList());
? ? ? ? ? ? return new DiffResult<T>()
? ? ? ? ? ? ? ? ? ? .setAddedList(null)
? ? ? ? ? ? ? ? ? ? .setChangedList(null)
? ? ? ? ? ? ? ? ? ? .setDeletedList(wrapperBaseList);
? ? ? ? }
? ? ? ? return null;
? ? }? ? @Data
? ? @AllArgsConstructor
? ? public static class User {
? ? ? ? private Integer id;
? ? ? ? private String userName;
? ? ? ? private String address;
? ? ? ? private String email;
? ? }
}

4.ObjectComparator類

public class ObjectComparator<T> implements Comparator<T> {
? ? @Override
? ? public int compare(T o1, T o2) {
? ? ? ? // 反射來動態(tài)獲取對象的屬性
? ? ? ? Field[] fields = o1.getClass().getDeclaredFields();
? ? ? ? for (Field field : fields) {
? ? ? ? ? ? field.setAccessible(true);
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? Object value1 = field.get(o1);
? ? ? ? ? ? ? ? Object value2 = field.get(o2);
? ? ? ? ? ? ? ? if (!isEqual(value1, value2)) {
? ? ? ? ? ? ? ? ? ? return compareValues(value1, value2);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } catch (IllegalAccessException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return 0;
? ? }
? ? private int compareValues(Object value1, Object value2) {
? ? ? ? if (value1 == null && value2 == null) {
? ? ? ? ? ? return 0;
? ? ? ? }
? ? ? ? if (value1 == null) {
? ? ? ? ? ? return -1;
? ? ? ? }
? ? ? ? if (value2 == null) {
? ? ? ? ? ? return 1;
? ? ? ? }
? ? ? ? if (value1 instanceof Comparable && value2 instanceof Comparable) {
? ? ? ? ? ? return ((Comparable) value1).compareTo(value2);
? ? ? ? }
? ? ? ? return 0;
? ? }
? ? private boolean isEqual(Object value1, Object value2) {
? ? ? ? if (value1 == null && value2 == null) {
? ? ? ? ? ? return true;
? ? ? ? }
? ? ? ? if (value1 == null || value2 == null) {
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? return value1.equals(value2);
? ? }
}

5.Test單元測試類

@RunWith(SpringRunner.class)
@SpringBootTest
public class DiffListUtilApplicationTest {
    @Test
    public void test1() {
        List<DiffListUtil.User> userList = new ArrayList<>();
        DiffListUtil diffListUtil = new DiffListUtil();
        userList.add(new DiffListUtil.User(11,"John","hunan","hunan@faw.com"));
        userList.add(new DiffListUtil.User(22,"Tom","jilin","jilin@faw.com"));
        List<DiffListUtil.User> userListAfter = new ArrayList<>();
        userListAfter.add(new DiffListUtil.User(33,"John","hunan","beijing@faw.com"));
        userListAfter.add(new DiffListUtil.User(22,"Wudaiming","hunan","hunan@faw.com"));
        Function<DiffListUtil.User, Object> primaryKeyExtractor = user -> user.getId();
        //Comparator<DiffListUtil.User> userComparator = Comparator
        //        .comparing(DiffListUtil.User::getId)
        //        .thenComparing(DiffListUtil.User::getUserName)
        //        .thenComparing(DiffListUtil.User::getAddress)
        //        .thenComparing(DiffListUtil.User::getEmail);
        ObjectComparator<DiffListUtil.User> userComparator = new ObjectComparator<>();
        DiffListUtil.DiffResult<DiffListUtil.User> userDiffResult = diffListUtil.diffList(userList, userListAfter, primaryKeyExtractor, userComparator);
        System.out.println(userDiffResult);
    }
}

 到此這篇關(guān)于JAVA中DIFF算法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)JAVA DIFF算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java8中的LocalDateTime你會使用了嗎

    Java8中的LocalDateTime你會使用了嗎

    LocalDateTime?是?Java?8?中日期時(shí)間?API?提供的一個類,在日期和時(shí)間的表示上提供了更加豐富和靈活的支持,本文就來講講LocalDateTime的一些具體使用方法吧
    2023-05-05
  • java ReentrantLock詳解

    java ReentrantLock詳解

    這篇文章主要介紹了java ReentrantLock,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java類的初始化順序的實(shí)現(xiàn)

    Java類的初始化順序的實(shí)現(xiàn)

    類的初始化過程是在類加載階段完成的,包括加載、驗(yàn)證、準(zhǔn)備、解析和初始化等步驟,本文主要介紹了Java類的初始化順序的實(shí)現(xiàn),感興趣的可以了解一下
    2023-12-12
  • maven?helper?jar包沖突的幾種解決方法

    maven?helper?jar包沖突的幾種解決方法

    maven Helper是排查jar包沖突的一大利器,jar包沖突大部分是由于引用了同一個jar的不同版本而導(dǎo)致的,本文主要介紹了maven?helper?jar包沖突的幾種解決方法,感興趣的可以了解一下
    2024-03-03
  • SpringMVC請求參數(shù)的使用總結(jié)

    SpringMVC請求參數(shù)的使用總結(jié)

    在日常使用SpringMVC進(jìn)行開發(fā)的時(shí)候,有可能遇到前端各種類型的請求參數(shù),本文主要接介紹了SpringMVC請求參數(shù)的使用總結(jié),感興趣的可以了解一下
    2021-06-06
  • java和jsp之間的request傳值方法

    java和jsp之間的request傳值方法

    這篇文章主要給大家介紹了關(guān)于java和jsp之間的request傳值方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Spring security自定義用戶認(rèn)證流程詳解

    Spring security自定義用戶認(rèn)證流程詳解

    這篇文章主要介紹了Spring security自定義用戶認(rèn)證流程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • idea在工具欄中顯示快速創(chuàng)建包和類的圖標(biāo)的詳細(xì)步驟

    idea在工具欄中顯示快速創(chuàng)建包和類的圖標(biāo)的詳細(xì)步驟

    點(diǎn)擊需要創(chuàng)建包或者類的位置,在點(diǎn)擊對用的圖標(biāo)就可以快速創(chuàng)建類或者包了,下面小編給大家介紹idea在工具欄中顯示快速創(chuàng)建包和類的圖標(biāo)的詳細(xì)步驟,感興趣的朋友一起看看吧
    2024-02-02
  • JavaWeb實(shí)現(xiàn)簡單查詢商品功能

    JavaWeb實(shí)現(xiàn)簡單查詢商品功能

    這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)簡單查詢商品功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • PageHelper插件實(shí)現(xiàn)一對多查詢時(shí)的分頁問題

    PageHelper插件實(shí)現(xiàn)一對多查詢時(shí)的分頁問題

    這篇文章主要介紹了PageHelper插件實(shí)現(xiàn)一對多查詢時(shí)的分頁問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評論

宁河县| 宣恩县| 长沙县| 西丰县| 呼伦贝尔市| 新郑市| 怀柔区| 措勤县| 寿阳县| 沁阳市| 璧山县| 乐亭县| 横山县| 开远市| 会宁县| 长泰县| 陈巴尔虎旗| 黄山市| 云浮市| 灵山县| 精河县| 白山市| 司法| 陈巴尔虎旗| 顺平县| 正安县| 时尚| 保定市| 绥滨县| 文安县| 平远县| 丽江市| 大石桥市| 巴马| 浪卡子县| 罗源县| 永泰县| 大同市| 宜黄县| 嘉善县| 江城|