一组数字,放在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算法推荐,谢谢!
中间有的是挨着的,有的有间隔,想分成下面的几组,放入map里
{{2,3},{5},{8,9,10},{20,21},{45},{47,48}}。求java算法推荐,谢谢!
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;
}
}
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;
}