您的位置:首页 > 编程语言 > Java开发

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: