新增一个值,刷新全局数据的排序值简单方法

新增一个值,刷新全局数据的排序值简单方法

一批有sorted排序值的数据

idsorted
centered 1right-aligned 2
centered 2right-aligned 3
centered 3right-aligned 4
centered 4right-aligned 7
centered 5right-aligned 9

现在需要添加一条数据id=6的数据但是要排在第一位,设置sorted值为2,其他的sorted需要变化,怎么做到改变最少条数的sorted值,依然保持sorted有序呢?


package test;

import org.springframework.util.CollectionUtils;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author zloser
 * @update 2023/10/26 21:21
 * @since 2023/10/26 21:21
 **/
public class TestSorted {
    static class Data {
        private Integer id;
        private Integer sorted;


        public Data() {

        }

        public Data(Integer id, Integer sorted) {
            this.id = id;
            this.sorted = sorted;
        }

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public Integer getSorted() {
            return sorted;
        }

        public void setSorted(Integer sorted) {
            this.sorted = sorted;
        }
    }

    public static void main(String[] args) {
        List<Data> dataList = new ArrayList<>();
        dataList.add(new Data(1, 2));
        dataList.add(new Data(2, 3));
        dataList.add(new Data(3, 4));
        dataList.add(new Data(4, 7));
        dataList.add(new Data(5, 9));
        Data addData = new Data(6, 2);

        List<Data> updateList = refreshDataSorted(dataList, addData);
        System.out.println(updateList);
    }

    public static List<Data> refreshDataSorted(List<Data> dataList, Data addData) {

        dataList.add(addData);

        // 先过滤处大于等于新添加的sorted值的数据
        List<Data> geSortedData = dataList.stream().filter(it -> it.getSorted() >= addData.getSorted()).collect(Collectors.toList());

        // 小于sorted值的数据 ,这个不用动,最后整合就好了
        List<Data> ltSortedData = dataList.stream().filter(it -> it.getSorted() < addData.getSorted()).collect(Collectors.toList());

        // 先按sorted值分组
        Map<Integer, List<Data>> sortedGpMap = geSortedData.stream().collect(Collectors.groupingBy(Data::getSorted));

        // 对大于的排序值进行排序
        List<Integer> geSortedSortList = sortedGpMap.keySet().stream().sorted().collect(Collectors.toList());

        Map<Integer, Integer> addSortedNumMap = new HashMap<>();

        Integer lastMinSorted = addData.getSorted();
        // 计算哪些sorted值需要往后增加
        for (Integer sortedL : geSortedSortList) {
            if (sortedL <= lastMinSorted) {
                int num = lastMinSorted - sortedL + 1;
                // 记录需要变更的值,变更多少
                addSortedNumMap.put(sortedL, num);
                lastMinSorted += num;
            }else {
                ltSortedData.addAll(sortedGpMap.get(sortedL));
            }
        }
        // 修改值重新组装数据

        for (Integer sortedInt : addSortedNumMap.keySet()) {
            List<Data> orDefault = sortedGpMap.getOrDefault(sortedInt, null);
            if (CollectionUtils.isEmpty(orDefault)) {
                continue;
            }

            for (Data data : orDefault) {
                // 自身不修改
                if (!data.getId().equals(addData.getId())) {
                    data.setSorted(data.getSorted() + addSortedNumMap.get(sortedInt));
                }
                // 重新组装数据
                ltSortedData.add(data);
            }
        }
        return ltSortedData.stream().sorted(new Comparator<Data>() {
            @Override
            public int compare(Data o1, Data o2) {
                if (o1.getSorted() < o2.getSorted()) {
                    return -1;
                }
                return 0;
            }
        }).collect(Collectors.toList());

    }
}


在这里插入图片描述

Alt

代码献上,自己 GET,爱你的菜鸟程序员💋💋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值