/**
* 需求描述
* 返回一个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”是一个经典的计算机科学问题,属于数据结构和算法的范畴。在编程领域,这个问题通常涉及到如何有效地将多个已排序的链表(或数组)合并成一个单一的有序序列。这个问题在处理大规模...
合并两个有序列表是一个常见任务,通常可以通过迭代或递归的方式来完成。在这个源代码中,可能会实现一个函数,将两个已排序的列表合并成一个大的有序列表,保持排序顺序。 删除结点操作需要找到指定元素的位置,并...
1,归并排序的概念 1.1,算法介绍 和选择排序一样,归并排序的性能不受输入...多路归并:将多个有序序列归并为一个新的有序序列;,称为多路归并; 最后知道大家都很苦恼学不会,那就看看这个吧,相信你可以学会的
实验的目标是掌握两个有序线性表的归并算法,分为顺序存储结构和链表实现两个部分。实验的具体要求包括从键盘输入数据构建两个有序线性表,然后合并这两个线性表,最后输出归并后的有序线性表。在链表实现中,特别...
1. **分割**:将原始数组分割成两个或更多个相等或接近相等的部分。通常,我们选择将其一分为二,但也可以根据实际情况进行调整。 2. **递归排序**:对每个分割出来的子数组递归地应用归并排序。这意味着每个子数组...
3. **多路归并阶段**:将所有已排序的子数组进行多路归并,这个过程涉及到多个有序序列的合并,需要巧妙地设计合并策略以确保整体的有序性。可以使用优先队列(堆)或者其他数据结构辅助实现这一过程。 4. **返回...
综上所述,尽管提供的代码片段并没有直接展示归并排序的具体实现,但从函数名和描述来看,这段代码可能与归并排序的应用场景相关,例如在搜索系统或数据库查询中寻找两个有序列表的交集。通过对这段代码的解析,我们...
三路归并排序的核心是将一个大数组分为三个较小的子数组,分别对这三个子数组进行排序,然后将排序后的子数组合并成一个有序的大数组。这种方法可以有效地处理具有大量重复元素的情况,因为它避免了在合并过程中不必...
多路平衡归并是归并排序的一种扩展,尤其适用于大数据集的排序,它通过将多个已经部分排序的子序列合并成一个完全有序的序列,从而实现全局的有序状态。此项目使用了微软的Visual C++ 2012开发环境,这是一款强大的...
3. **合并**:将排序好的两个子数组合并成一个有序数组。 #### 三、归并排序的实现 下面通过具体的代码实现来详细解析归并排序的过程: ```cpp #include using namespace std; // 合并函数 void guibing(int *a,...
在归并排序中,我们首先将一个未排序的数组拆分成多个只包含一个元素的子数组,然后通过不断地合并这些子数组,将它们逐步归并成更大的有序序列,直至最后得到一个完整的有序数组。 具体来说,归并排序的过程包括...
最后,将这些子数组通过归并操作合并为一个有序数组。这一过程重复进行,直至整个数组被排序。 #### 程序实现要点 在归并排序的程序实现中,通常会使用额外的辅助数组来存储合并过程中的中间结果。这是因为原地...
在收集步骤中,将各队列链接起来,形成一个有序序列。 8. 基数排序的时间复杂度分析 基数排序的时间复杂度为 O(d \* (n + RADIX),这是因为在每次分配和收集操作中,需要对 n 个记录进行处理,总共需要进行 d 次...
具体来说,它首先将待排序的序列分为两个相等(或近似相等)的部分,分别对这两部分进行排序,再将排序后的两部分合并成一个有序序列。这个过程会递归地应用于每一部分,直到每个部分只包含一个元素,此时再逐个合并...