`

多个列表有序归并

阅读更多
/**
 * 需求描述
 * 返回一个map,map中存放的一下的列表
 * 综合排序:List<id> 1,2,3,4,5,6
 * 销量排序:List<id> 6,4,68,9,0,8
 * 价格排序:List<id> 8,2,3,5,6,7,3
 * 处理后的结果:
 * 假定要取出6个数据,预先从指定的列表顺序。在list1中取一个元素,list2中取出一个元素,list3中取出一个元素。如果上一个list中获得值,
 * 继续当前list的下个元素,循环上述操作,直到取到6个元素
 * 得到结果集 1,2,6,4,8,3
 * <p>
 * Created by lijianzhen1 on 2017/6/15.
 */
public class Test {
    public static void main(String[] args) {
        Map<Integer, List<Integer>> unDealWithMap = genrateResultMap();
        Integer[] enums = {1, 2, 3};//对应的枚举数据
        //处理后的结果集合
        Map<Integer, Integer> resultMap = Maps.newHashMap();
        //对应各个列表的游标
        Map<Integer, Integer> vernier = Maps.newHashMap();
        //获得对应的游标初始位置
        for (Integer index : enums) {
            vernier.put(index, 0);
        }
        //默认选择返回的项为6项
        while (resultMap.size() < 6)
            //循环枚举值
            for (Integer index : enums) {
                //获得对应的列表
                List<Integer> list = unDealWithMap.get(index);
                if (CollectionUtils.isNotEmpty(list)) {
                    //列表的大小
                    int size = list.size();
                    Integer element = list.get(vernier.get(index));//获得当前的元素值
                    //是否已经记录
                    boolean isover = false;
                    //当前游标位置不能数组越界
                    while (vernier.get(index) < size) {
                        //已经记录跳出循环
                        if (isover) {
                            break;
                        }
                        //没有获得元素放入map中。如果返回是list在这里修改就好
                        if (null == resultMap.get(element)) {
                            resultMap.put(list.get(vernier.get(index)), list.get(vernier.get(index)));
                            isover = true;
                        }
                        vernier.put(index, vernier.get(index) + 1);
                    }
                }
            }
        System.out.println(resultMap);
    }


    /**
     * 生成需要的列表
     * @return
     */
    private static Map<Integer, List<Integer>> genrateResultMap() {
        List<Integer> list1 = Lists.newArrayList();
        List<Integer> list2 = Lists.newArrayList();
        List<Integer> list3 = Lists.newArrayList();

        int i = 0;
        while (i < 10) {
            list1.add(new Random().nextInt(100));
            list2.add(new Random().nextInt(100));
            list3.add(new Random().nextInt(100));
            i++;
        }
        Map<Integer, List<Integer>> resultMap = Maps.newHashMap();
        resultMap.put(1, list1);
        resultMap.put(2, list2);
        resultMap.put(3, list3);
        return resultMap;
    }
}
分享到:
评论

相关推荐

    数据结构 两个有序线性表的归并算法 西南交通大学

    在该算法中,我们使用了多个函数来实现两个有序线性表的归并。这些函数包括: * void CreateList(List &L):新建顺序表 * void DisPlay(List &L):遍历并输出顺序表 * List MargeTIO(List &La, List &Lb):将链表 ...

    二路归并排序

    归并排序是一种基于比较的排序算法,它将待排序的记录分成两个或多个部分,然后对每个部分进行排序,最后将已排序的部分合并成一个有序的序列。 二路归并排序 二路归并排序是指将两个有序表归并成一个有序表的过程...

    多路归并算法

    "多路"指的是在归并过程中可能有多个已经排序好的子序列,这些子序列将被合并成一个大的有序序列。传统的二路归并是其中的一种特殊情况,它合并两个已排序的序列。而在多路归并中,我们可以合并任意数量的有序子序列...

    合并k个有序的list

    标题中的“合并k个有序的list”是一个经典的计算机科学问题,属于数据结构和算法的范畴。在编程领域,这个问题通常涉及到如何有效地将多个已排序的链表(或数组)合并成一个单一的有序序列。这个问题在处理大规模...

    数据结构之有序列表 - SequenceList

    合并两个有序列表是一个常见任务,通常可以通过迭代或递归的方式来完成。在这个源代码中,可能会实现一个函数,将两个已排序的列表合并成一个大的有序列表,保持排序顺序。 删除结点操作需要找到指定元素的位置,并...

    归并排序(视屏+代码)

    1,归并排序的概念 1.1,算法介绍 和选择排序一样,归并排序的性能不受输入...多路归并:将多个有序序列归并为一个新的有序序列;,称为多路归并; 最后知道大家都很苦恼学不会,那就看看这个吧,相信你可以学会的

    西南交通大学数据结构实验之有序线性表的归并参考实验报告

    实验的目标是掌握两个有序线性表的归并算法,分为顺序存储结构和链表实现两个部分。实验的具体要求包括从键盘输入数据构建两个有序线性表,然后合并这两个线性表,最后输出归并后的有序线性表。在链表实现中,特别...

    归并算法的代码

    1. **分割**:将原始数组分割成两个或更多个相等或接近相等的部分。通常,我们选择将其一分为二,但也可以根据实际情况进行调整。 2. **递归排序**:对每个分割出来的子数组递归地应用归并排序。这意味着每个子数组...

    多路归并之根号n排序

    3. **多路归并阶段**:将所有已排序的子数组进行多路归并,这个过程涉及到多个有序序列的合并,需要巧妙地设计合并策略以确保整体的有序性。可以使用优先队列(堆)或者其他数据结构辅助实现这一过程。 4. **返回...

    一个 c c++写的归并排序算法

    综上所述,尽管提供的代码片段并没有直接展示归并排序的具体实现,但从函数名和描述来看,这段代码可能与归并排序的应用场景相关,例如在搜索系统或数据库查询中寻找两个有序列表的交集。通过对这段代码的解析,我们...

    三路归并_C语言_三路归并排序_三路归并_

    三路归并排序的核心是将一个大数组分为三个较小的子数组,分别对这三个子数组进行排序,然后将排序后的子数组合并成一个有序的大数组。这种方法可以有效地处理具有大量重复元素的情况,因为它避免了在合并过程中不必...

    VC++2012编程演练数据结构《35》多路平衡归并

    多路平衡归并是归并排序的一种扩展,尤其适用于大数据集的排序,它通过将多个已经部分排序的子序列合并成一个完全有序的序列,从而实现全局的有序状态。此项目使用了微软的Visual C++ 2012开发环境,这是一款强大的...

    归并排序 归并排序示例

    3. **合并**:将排序好的两个子数组合并成一个有序数组。 #### 三、归并排序的实现 下面通过具体的代码实现来详细解析归并排序的过程: ```cpp #include using namespace std; // 合并函数 void guibing(int *a,...

    归并排序 数据结构

    在归并排序中,我们首先将一个未排序的数组拆分成多个只包含一个元素的子数组,然后通过不断地合并这些子数组,将它们逐步归并成更大的有序序列,直至最后得到一个完整的有序数组。 具体来说,归并排序的过程包括...

    归并算法思想总结

    最后,将这些子数组通过归并操作合并为一个有序数组。这一过程重复进行,直至整个数组被排序。 #### 程序实现要点 在归并排序的程序实现中,通常会使用额外的辅助数组来存储合并过程中的中间结果。这是因为原地...

    理解归并排序的算法思想及其算法设计

    在收集步骤中,将各队列链接起来,形成一个有序序列。 8. 基数排序的时间复杂度分析 基数排序的时间复杂度为 O(d \* (n + RADIX),这是因为在每次分配和收集操作中,需要对 n 个记录进行处理,总共需要进行 d 次...

    数据结构——归并排序

    具体来说,它首先将待排序的序列分为两个相等(或近似相等)的部分,分别对这两部分进行排序,再将排序后的两部分合并成一个有序序列。这个过程会递归地应用于每一部分,直到每个部分只包含一个元素,此时再逐个合并...

Global site tag (gtag.js) - Google Analytics