java如何将集合中连续的数值间隔开
2016-12-02 16:34
183 查看
题:
假设 集合为:{9,4,7} 即:9个1,4个2,7个3 -----> {1,1,1,1,1,1,1,1,1,2,2,2,2,,3,3,3,3,3,3,3},
希望得到的结果为类似于:121341231231212121...... 将所有的1,2,3,分隔开,保证不连续。
本人的解决方案:
1.将list转为一个LinkedHashMap<Integer,Integer> ,LinkedHashMap中 的key值为1,2,3 value值为1,2,3 的个数 ,按照降序进行排列。
LinkedHashMap ={(1,9),(3,7),(2,4)....}
2. 初始化一个空的数组list,对map进行循环,
保证每次循环都是隔着上次循环的数值插入数据。
如第一次循环,将(1,9)插入数组:list={1,1,1,1,1,1,1,1,1}
将map的key=1 删除
第二次循环,将(3,6)插入数组:list={1,3,1,3,1,3,1,3,1,3,1,3,1,1,1}
将map的key=3 删除
第三次循环,将(2,4)插入数组:list={1,3,2,1,3,2,1,3,2,1,3,2,1,3,1,3,1,1,1}
3. 将list中的最后2个1进行重新插入。
3.1 记录LinkedHashMap的循环数 , 按照1,3,2,1,3,2循环,所以循环数为 3
对开始的LinkedHashMap进行一次循环,获取第一组和第二组的key,value值。
假设第一组key为key1,value为value1
第一组key为key2,value为value2
最后的2个1 重新排序: 其中2 = value1-value2-1 , 1 = key1
根据循环数,即可将2个1重新插入到之前的list中。
下面是代码:
/**
*
* @param map
* @param resultList
*/
public List<Integer> method4(int[] resultPageNum){
Map<Integer,Integer> map = intToMap(resultPageNum);
List<Integer> resultList = new ArrayList<Integer>();
int i =map.size(); //记录版式的循环数。
if(i>1){
int maxValue=0,secondvalue=0,flag=0;
//获取map的第一个key和value,第二个value
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if(flag>1){
break;
}
if(flag == 0){
maxValue = entry.getValue();
flag++;
}else{
secondvalue = entry.getValue();
flag++;
}
}
resultList = sortMap(map, resultList, 1);
int difValue = maxValue - secondvalue-1; //差值 1324132413241324132131311 对最后的一个1进行重新排序
if(difValue>0){
//每次循环移除最后一个
int listSize = resultList.size();
int maxKey = resultList.get(listSize-1);
for(int k=0; k<difValue; k++){
if((i-1)*(k+1)-1<listSize){
resultList.remove(listSize-1);
resultList.add((i-1)*(k+1), maxKey);
}
}
}
}
for(Integer num :resultList){
System.out.print(num);
}
return resultList;
}
public Map<Integer,Integer> intToMap( int[] resultPageNum){
Map<Integer,Integer> map = new LinkedHashMap<Integer,Integer>();
for(int i = 0; i<resultPageNum.length ; i++){
map.put(i+1, resultPageNum[i]);
}
//按照value排序
List<Map.Entry<Integer,Integer>> list = new ArrayList<Map.Entry<Integer,Integer>>(map.entrySet());
Collections.sort(list,new Comparator<Map.Entry<Integer,Integer>>() {
public int compare(Entry<Integer,Integer> o1,Entry<Integer,Integer> o2) {
return o2.getValue().compareTo(o1.getValue());
}
});
map.clear();
for (int i = 0; i < list.size(); i++) {
map.put(list.get(i).getKey(), list.get(i).getValue());
}
return map;
}
/**
*
* @param map
* @param resultList
* @param flag 标记map循环的次数
* @return
*/
public static List<Integer> sortMap(Map<Integer,Integer> map,List<Integer> resultList,int flag){
//剩余最多的一个。
if(map.size()<1){
return resultList;
}
for(Map.Entry<Integer, Integer> entry : map.entrySet()){
Integer key = entry.getKey();
Integer value = entry.getValue();
if(flag==0){
for(int i =0;i<value ;i++){
resultList.add(key);
}
}else{
for(int i =0;i<value ;i++){
resultList.add(flag*(i+1)-1, key);
}
}
map.remove(key);
flag++;
break ;
}
return sortMap(map, resultList, flag);
}
public static void main(String[] args) {
int[] resultPageNum ={9,6,3};
WeChatMerchant chatMerchant = new WeChatMerchant();
chatMerchant.method4(resultPageNum);
}
假设 集合为:{9,4,7} 即:9个1,4个2,7个3 -----> {1,1,1,1,1,1,1,1,1,2,2,2,2,,3,3,3,3,3,3,3},
希望得到的结果为类似于:121341231231212121...... 将所有的1,2,3,分隔开,保证不连续。
本人的解决方案:
1.将list转为一个LinkedHashMap<Integer,Integer> ,LinkedHashMap中 的key值为1,2,3 value值为1,2,3 的个数 ,按照降序进行排列。
LinkedHashMap ={(1,9),(3,7),(2,4)....}
2. 初始化一个空的数组list,对map进行循环,
保证每次循环都是隔着上次循环的数值插入数据。
如第一次循环,将(1,9)插入数组:list={1,1,1,1,1,1,1,1,1}
将map的key=1 删除
第二次循环,将(3,6)插入数组:list={1,3,1,3,1,3,1,3,1,3,1,3,1,1,1}
将map的key=3 删除
第三次循环,将(2,4)插入数组:list={1,3,2,1,3,2,1,3,2,1,3,2,1,3,1,3,1,1,1}
3. 将list中的最后2个1进行重新插入。
3.1 记录LinkedHashMap的循环数 , 按照1,3,2,1,3,2循环,所以循环数为 3
对开始的LinkedHashMap进行一次循环,获取第一组和第二组的key,value值。
假设第一组key为key1,value为value1
第一组key为key2,value为value2
最后的2个1 重新排序: 其中2 = value1-value2-1 , 1 = key1
根据循环数,即可将2个1重新插入到之前的list中。
下面是代码:
/**
*
* @param map
* @param resultList
*/
public List<Integer> method4(int[] resultPageNum){
Map<Integer,Integer> map = intToMap(resultPageNum);
List<Integer> resultList = new ArrayList<Integer>();
int i =map.size(); //记录版式的循环数。
if(i>1){
int maxValue=0,secondvalue=0,flag=0;
//获取map的第一个key和value,第二个value
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if(flag>1){
break;
}
if(flag == 0){
maxValue = entry.getValue();
flag++;
}else{
secondvalue = entry.getValue();
flag++;
}
}
resultList = sortMap(map, resultList, 1);
int difValue = maxValue - secondvalue-1; //差值 1324132413241324132131311 对最后的一个1进行重新排序
if(difValue>0){
//每次循环移除最后一个
int listSize = resultList.size();
int maxKey = resultList.get(listSize-1);
for(int k=0; k<difValue; k++){
if((i-1)*(k+1)-1<listSize){
resultList.remove(listSize-1);
resultList.add((i-1)*(k+1), maxKey);
}
}
}
}
for(Integer num :resultList){
System.out.print(num);
}
return resultList;
}
public Map<Integer,Integer> intToMap( int[] resultPageNum){
Map<Integer,Integer> map = new LinkedHashMap<Integer,Integer>();
for(int i = 0; i<resultPageNum.length ; i++){
map.put(i+1, resultPageNum[i]);
}
//按照value排序
List<Map.Entry<Integer,Integer>> list = new ArrayList<Map.Entry<Integer,Integer>>(map.entrySet());
Collections.sort(list,new Comparator<Map.Entry<Integer,Integer>>() {
public int compare(Entry<Integer,Integer> o1,Entry<Integer,Integer> o2) {
return o2.getValue().compareTo(o1.getValue());
}
});
map.clear();
for (int i = 0; i < list.size(); i++) {
map.put(list.get(i).getKey(), list.get(i).getValue());
}
return map;
}
/**
*
* @param map
* @param resultList
* @param flag 标记map循环的次数
* @return
*/
public static List<Integer> sortMap(Map<Integer,Integer> map,List<Integer> resultList,int flag){
//剩余最多的一个。
if(map.size()<1){
return resultList;
}
for(Map.Entry<Integer, Integer> entry : map.entrySet()){
Integer key = entry.getKey();
Integer value = entry.getValue();
if(flag==0){
for(int i =0;i<value ;i++){
resultList.add(key);
}
}else{
for(int i =0;i<value ;i++){
resultList.add(flag*(i+1)-1, key);
}
}
map.remove(key);
flag++;
break ;
}
return sortMap(map, resultList, flag);
}
public static void main(String[] args) {
int[] resultPageNum ={9,6,3};
WeChatMerchant chatMerchant = new WeChatMerchant();
chatMerchant.method4(resultPageNum);
}
相关文章推荐
- 如何使用Java中集合类的详细讲解
- Java中如何删除一个集合中的多个元素
- Java如何随机取出集合中的元素
- Java 调用存储过程中的集合,如何传参
- java如何使用大数值
- java中如何将String类型的日期转换成数值及计算
- java如何探测数组当中相同的连续值?
- DB2中如何使用SQL查找非连续数值
- Java中如何循环删除一个集合(如List)中的多个元素
- java如何对map进行排序详解(map集合的使用)
- Java:如何封装集合
- Java中如何循环删除一个集合(如List)中的多个元素
- 循环的时候如何安全地删除java集合的元素
- 【转java的double的大数值时 如何才能不显示成科学计数法】
- Java中list集合的交集和差集的用法和如何将数组转换为集合的方法
- Java中如何删除一个集合中的多个元素
- java中如何对数组和集合进行排序
- Java中如何获得集合变量的集合中的类型参数
- 如何删除Java集合中的元素
- Java中如何获取Enumeration集合