`

多个列表有序归并

阅读更多
/**
 * 需求描述
 * 返回一个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;
    }
}
分享到:
评论

相关推荐

    合并k个有序的list

    NULL 博文链接:https://dugu61888.iteye.com/blog/1978054

    数据结构-归并排序.doc

    而对两个有序表的归并,称为二路归并。对于一个表进行归并排序,可以理解为 对该表进行了多次二路排序。因此,本实验的核心即转化为设计二路归并算法,并对其 进行递归。 1. 输入形式:键盘输入一组数据 输入值范围...

    今天会是有Offer的一天么:面试时你真的会写归并排序么

    再两两归并,如此重复,直至最后形成包含n个记录的有序文件位置,这种反复将两个有序文件归并成一个有序文件的排序方法称为二路归并排序。 废话不多说直接上代码 import java.util.ArrayList; import java.

    C++实现归并排序算法

    若将两个有序表合并成一个有序表,称为二路归并。 算法描述 归并操作的工作原理如下: 1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 2、设定两个指针,最初位置分别为两个已经排序序列...

    归并排序解说,动画演示

    归并排序是一种分治思想的排序算法,它的基本思想是将待排序的数组分成若干个子序列,每个子序列都是有序的,然后再将子序列合并成一个有序的数组。 归并排序的时间复杂度为O(nlogn),它的性能比冒泡排序和插入排序...

    C语言分治法实现归并排序

    将两个及其以上的有序表合并为一张有序表,把待排序序列通过分治法分为若干个有序子序列,然后每两个子序列合并为一个子序列,经过多次合并后整合为一张有序表。 排序过程如图: 代码如下: #include stdio.h #...

    线性表的归并 个人作业 简单明了

    本资源针对一个相同的线性表,分别采用了 顺序表 单表表 两种不同的数据结构进行编程,既简单,又能让你体会数据结构的核心,赶快下载,机会不多。

    C语言归并、选择、直接插入、希尔、冒泡、快速、堆排序与顺序、二分查找排序.rar

    归并排序(Merge Sort):采用分治法,将待排序数组递归地分成两部分,分别进行排序,然后合并两个有序数组。 选择排序(Selection Sort):每次从未排序的部分选出最小(或最大)的元素,放到已排序部分的末尾。 ...

    数据结构实验

    2. 掌握单链表基本操作及两个有序表归并、单链表逆置等操作的实现。 二 、实验要求 1.预习C语言中结构体的定义与基本操作方法。 2.对单链表的每个基本操作用单独的函数实现。 3.编写完整程序完成下面的实验内容并...

    数据结构考研纲要

    采用有效的内排序方法分别进行排序,生成若干个有序子文件;即初始归并段 ②多趟归并排序 (3)归并排序 (4)m路归并;m+1个缓冲区:m个输入一个输出(并行处理加倍) (5)为减少平衡归并中外存读写次数;增大归并路数和...

    python 有序数组的平方,给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非

    因此这题的本质是两个有序数组的组合后进行拆分并合并 # 方法比较多, 比如先找出最中心的数字后转换成两个数组进行归并运算, 但是双指针方法是最简单的 # 截止条件定在为正负分界线上, 一旦达到表示其中一个数字...

    9种排序方法及python实现(冒泡,插入,希尔,选择,堆,快速,桶,基数,归并排序)

    在排序阶段,先读入能放在内存中的数据量,将其排序输出到一个临时文件,依此进行,将待排序数据组织为多个有序的临时文件。而后在归并阶段将这些临时文件组合为一个大的有序文件,也即排序结果。 (2)内部排序还...

    比较常用的排序算法

    5)归并排序:设有两个有序(升序)序列存储在同一数组中相邻的位置上,不妨设为A[l..m],A[m+1..h],将它们归并为一个有序数列,并存储在A[l..h]。 6)快速排序:快速排序是对冒泡排序的一种本质改进。它的基本...

    java算法大全源码包.zip

    若将两个有序表合并成一个有序表,称为二路归并。时间复杂度O(n log n) 。 (6)堆排序 利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。

    大数据常用组件流程

    MR 1.MapTask调用Inputformat方法创建一个RecordReader RecordReader以此调用nextkeyvalue getcurrentkey ...几个文件(多次溢出生成多个文件) 3.在Merge中将这几个文件进行归并排序后生成一个(局部有序–&gt;分区内有序

    排序算法(二)希尔排序+归并排序+快速排序+堆排序–O(nlogn)的排序

    当原数组的一个元素如果距离它正确的位置很远的话,需要与相邻元素交换多次才能到达正确的位置,这样效率较低。希尔排序就是插入排序排序的一种简单改进,交换不相邻的元素以对数组的局部进行排序,以此来提升效率。...

    数据结构与算法.xmind

    递归拆分出两个有序的数组,从mid的位置开始拆分,递归出口:只有一个值的时候就不用拆分了 合并两个有序的数据 分别往两个数组填充已有序的数据 比较两个数组的值谁小,谁小就放到我们的...

    经历BAT面试后总结的【高级Java后台开发面试指南】,纯净干货无废话,针对高频面试点

    数组-归并排序-合并有序数组 链表-链表反转-链表相加 链表-双指针-删除倒数第n个 二叉树-递归-二叉树反转 二叉树-递归-多叉树中最长的连续序列 动态规划-连续子数组最大和 数据结构-LRU淘汰算法 其他-二十进制相加 ...

    LeetCode解题总结

    3.16.1 字符串前后和中间可能存在多个空格 3.16.2 不存在前后和中间的多余空格 3.17 一个编辑距离 4. 栈 4.1 验证括号的正确性 4.2 最长的正确括号表达式 4.3 柱状图中的最大矩形面积 4.4 计算逆波兰式的值 5. 树 ...

    大数据的一些面试题.pdf

    正向索引的查询往往满⾜每个⽂档有序 频繁的全⽂查询和每个单词在校验⽂档中的验证 这样的查询。在正向索引中,⽂档占据了中⼼的位置,每个⽂档指向了⼀个它所包含的索引项的序列。也就是说⽂档 指向了它包含的那些...

Global site tag (gtag.js) - Google Analytics