一组数字,放在ArrayList中,如:2,3,5,8,9,10,20,21,45,47,48,
中间有的是挨着的,有的有间隔,想分成下面的几组,放入map里
{{2,3},{5},{8,9,10},{20,21},{45},{47,48}}。求java算法推荐,谢谢!

解决方案 »

  1.   


    import java.util.*;
    public class ArrangeNumbers 
    {
    public static void main(String[] args)
    {
    Integer[] a = {2,3,5,8,9,10,20,21,45,47,48};
    List<Integer> list = new ArrayList<Integer>();//放容器里。
    for(Integer i: a)
    {
    list.add(i);
    }
    Map<Integer,List<Integer>> map = getResult(list);

    for(int k = 0 ; k < map.size() ; k++)
    {
    System.out.println(map.get(k));
    }
    }
    /**
     * 
     * @param list 已经排好续的一个List<Integer> 容器,存放要处理的数据。
     * @return Map<Integer,List<Integer>>
     * 结果防在一个Map容器里,键值是integer型,每找到一部分连续的数据,用j的值作为键值,连续数放一
     * list<Integer> 里,放入Map.
     * 直到list里的所有元素找完,返回。
     * j 用于作键值,自动增加。
     */
    public static Map<Integer,List<Integer>> getResult(List<Integer> list)
    {
    Map<Integer,List<Integer>> map = new HashMap<Integer,List<Integer>>();//用于存结果。
    int j = 0;//计数清零。
    while(list.size()> 0 )//还有元素.
    {
    Integer i = list.get(0);//取出第一个.
    List<Integer> list1 = new ArrayList<Integer>();//保存找到的连着的数.
    list1.add(i); list.remove(i);//存入容器后删除。
    while(list.size() != 0 && list.get(0) - i == 1)//连着的。(i 用了自动拆箱).
    {
    i = list.get(0);//取相邻的大于1的数,存容器后删除。
    list1.add(i);
    list.remove(i);
    }
    map.put(j++,list1);//遇到跳跃的数了,放入容器。进行下一次过程。
    }
    return map;
    }
    }
      

  2.   


      public Map<Integer, List<Integer>> getMap()
        {
           Integer[] a = {2,3,4,5,8,9,10,20,21,45,47,48,49}; 
            
            //用于存放集合的map
            Map<Integer, List<Integer>> map = new HashMap<Integer,List<Integer>>();
            
            int j = 0;//计数器
            
            List<Integer> list =new ArrayList<Integer>();//存放相邻数字的list
            
            for(int i =0;i<a.length-1;i++)
            { 
                list.add(a[i]);
                
                //找出每次拐点
                if (i+1<a.length && a[i] + 1 != a[i + 1])
                {
                   //把拐点之前出现的数字放入map
                   map.put(j++, list);
                   //清空list
                   list =new ArrayList<Integer>();               
                }  
                
                //存放最后一次拐点后的list
                if(a[i+1] == a[a.length-1])
                {
                    list.add(a[i+1]);
                    map.put(j++, list);
                }
                
            }
            return map;
        }