把一个数组按规则分组 比如{1,1,1,2,2,3,1,1} 变为:{{1,1,1},{2,2},3,{1,1}}要写成一个通用的方法/函数,可以用集合框架中的List 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这是作业?public static void main(String[] args) throws IOException { int[][] result = parseArray(new int[]{1,1,1,2,2,3,1,1}); System.out.print("{"); for(int i = 0; i < result.length; i ++){ System.out.print("{"); for(int j = 0; j < result[i].length; j ++){ System.out.print(result[i][j]); if(j != result[i].length - 1) System.out.print(","); } System.out.print("}"); if(i != result.length - 1) System.out.print(","); } System.out.print("}"); } private static int[][] parseArray(int[] array){ List<int[]> list = new ArrayList<int[]>(); int value = array[0]; int length = 1; for(int i = 1 ; i < array.length; i ++){ if(array[i] != value){ int[] arr = new int[length]; for(int j = 0 ; j < arr.length ; j ++){ arr[j] = value; } list.add(arr); value = array[i]; length = 1; }else length ++; } int[] arr = new int[length]; for(int j = 0 ; j < arr.length ; j ++){ arr[j] = value; } list.add(arr); return list.toArray(new int[list.size()][]); } 刚想了个更简单的办法String str = "1,1,1,3,2,51,3,3,55,55,55,3,3,2"; Pattern p = Pattern.compile("(?:(\\d+)[,]?)+?(?!\\1)"); Matcher m = p.matcher(str); List<int[]> list = new ArrayList<int[]>(); while(m.find()){ String[] temp = m.group().split(","); int[] array = new int[temp.length]; for(int i = 0 ; i < array.length; i ++) array[i] = Integer.parseInt(temp[i]); list.add(array); } Integer [] nums = {1, 2, 3, 3, 2, 1, 1, 5, 7,9, 1}; List<List<Integer>> outList = toGroup(nums); //输出 //[[1, 1, 1, 1], [2, 2], [3, 3], [5], [7], [9]] System.out.println(outList); /** * 返回结果为list形式 * <br>------------------------------<br> * @return */ private static List<List<Integer>> toGroup(Integer [] nums) { if (nums == null || nums.length == 0) { return null; } List<Integer> list= new ArrayList<Integer>(nums.length); Collections.addAll(list, nums); Collections.sort(list); int x = list.get(0); List<List<Integer>> outList = new ArrayList<List<Integer>>(); List<Integer> innerList = new ArrayList<Integer>(); outList.add(innerList); for (int i = 1; i < list.size(); i++) { int num = list.get(i); if (num == x) { innerList.add(num); } else { x = num; innerList = new ArrayList<Integer>(); innerList.add(num); outList.add(innerList); } } return outList; } 创建一个空的list和一个最后结果resultList,得到第一个数字并塞入list并用一个previous记录当前这个数字遍历下一个,如果和previous相等继续塞入list继续往下;如果和previous不相等将list加入resultList,清空list,将previous更新为当前值,将当前值塞入清空后的list。一直循环到最后最后将最后的list塞入resultList public static void main(String[] args){ Integer [] nums = {1, 2, 3, 3, 2, 1, 1, 5, 7,9, 1}; Map<String,Integer> map = new LinkedHashMap(); for(int i= 0;i<nums.length;i++){ if(map.containsKey(nums[i]+"")){ map.put(nums[i]+"",map.get(nums[i]+"")+ 1); } else map.put(nums[i]+"", 1); } System.out.println(map); List<List<Integer>> data = new ArrayList<List<Integer>>(); for(String e: map.keySet()){ List<Integer> temp = new ArrayList<Integer>(); for(int i = 0;i<map.get(e);i++){ temp.add(Integer.parseInt(e)); } data.add(temp); } System.out.println(data); } public class LinkedHashMap<K,V>extends HashMap<K,V>implements Map<K,V>Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序)。注意,如果在映射中重新插入 键,则插入顺序不受影响。(如果在调用 m.put(k, v) 前 m.containsKey(k) 返回了 true,则调用时会将键 k 重新插入到映射 m 中。) 此实现可以让客户避免未指定的、由 HashMap(及 Hashtable)所提供的通常为杂乱无章的排序工作,同时无需增加与 TreeMap 相关的成本。使用它可以生成一个与原来顺序相同的映射副本,而与原映射的实现无关: void foo(Map m) { Map copy = new LinkedHashMap(m); ... } 实现代码 :import java.util.Map;import java.util.List;import java.util.ArrayList;import java.util.LinkedHashMap;public class ArrayTest{ public static void main(String[] args) { Integer [] nums = {1,1,1,2,2,3,1,1} ; Map<String,Integer> map = new LinkedHashMap<String,Integer>(); for(int i= 0;i<nums.length;i++){ if(map.containsKey(nums[i]+"")){ map.put(nums[i]+"",map.get(nums[i]+"")+ 1); } else map.put(nums[i]+"", 1); } System.out.println(map); List<List<Integer>> data = new ArrayList<List<Integer>>(); for(String e: map.keySet()) { List<Integer> temp = new ArrayList<Integer>(); for(int i = 0;i<map.get(e);i++){ temp.add(Integer.parseInt(e)); } data.add(temp); } System.out.println(data); }} 6楼看错题目了。那这样更简单了一个循环搞定了。Integer [] nums = {1, 2, 3, 3, 2, 1, 1, 5, 7,9, 1};List<List> list = new ArrayList<List>();List tempdata = new ArrayList<Integer>();for(Integer e: mums){if(tempdata.size()==0){tempdata.add(e);}else if(tempdata.get(0)==e){tempdata.add(e);}else{list.add(tempdata);tempdata = new ArrayList();tempdata.add(e);}}list.add(tempdata); 在java中怎样将在内存里创建文件? 知道一个文件的绝对路径怎么生成文件 如何将加密的class文件反编译成.java文件,急。。。。 生成20位唯一编码,求思路 请问如何用java来提取autocad图纸(dwg)的缩略图? 关于计算机图形学中的Mandelbrot集合,计算过程出问题。 构造函数也可以又修饰符吗?--又是package惹的祸? JAVA中的继承类型? 如果用JavaScript关闭一个带多Frame的IE窗口? 求大神来科普一下lock与synchronized的区别 一个笔试题,求解答 关于java读写文件的问题
int[][] result = parseArray(new int[]{1,1,1,2,2,3,1,1});
System.out.print("{");
for(int i = 0; i < result.length; i ++){
System.out.print("{");
for(int j = 0; j < result[i].length; j ++){
System.out.print(result[i][j]);
if(j != result[i].length - 1)
System.out.print(",");
}
System.out.print("}");
if(i != result.length - 1)
System.out.print(",");
}
System.out.print("}");
}
private static int[][] parseArray(int[] array){
List<int[]> list = new ArrayList<int[]>();
int value = array[0];
int length = 1;
for(int i = 1 ; i < array.length; i ++){
if(array[i] != value){
int[] arr = new int[length];
for(int j = 0 ; j < arr.length ; j ++){
arr[j] = value;
}
list.add(arr);
value = array[i];
length = 1;
}else
length ++;
}
int[] arr = new int[length];
for(int j = 0 ; j < arr.length ; j ++){
arr[j] = value;
}
list.add(arr);
return list.toArray(new int[list.size()][]);
}
Pattern p = Pattern.compile("(?:(\\d+)[,]?)+?(?!\\1)");
Matcher m = p.matcher(str);
List<int[]> list = new ArrayList<int[]>();
while(m.find()){
String[] temp = m.group().split(",");
int[] array = new int[temp.length];
for(int i = 0 ; i < array.length; i ++)
array[i] = Integer.parseInt(temp[i]);
list.add(array);
}
Integer [] nums = {1, 2, 3, 3, 2, 1, 1, 5, 7,9, 1};
List<List<Integer>> outList = toGroup(nums);
//输出
//[[1, 1, 1, 1], [2, 2], [3, 3], [5], [7], [9]]
System.out.println(outList); /**
* 返回结果为list形式
* <br>------------------------------<br>
* @return
*/
private static List<List<Integer>> toGroup(Integer [] nums) {
if (nums == null || nums.length == 0) {
return null;
}
List<Integer> list= new ArrayList<Integer>(nums.length);
Collections.addAll(list, nums);
Collections.sort(list);
int x = list.get(0);
List<List<Integer>> outList = new ArrayList<List<Integer>>();
List<Integer> innerList = new ArrayList<Integer>();
outList.add(innerList);
for (int i = 1; i < list.size(); i++) {
int num = list.get(i);
if (num == x) {
innerList.add(num);
} else {
x = num;
innerList = new ArrayList<Integer>();
innerList.add(num);
outList.add(innerList);
}
}
return outList;
}
public static void main(String[] args){
Integer [] nums = {1, 2, 3, 3, 2, 1, 1, 5, 7,9, 1};
Map<String,Integer> map = new LinkedHashMap();
for(int i= 0;i<nums.length;i++){
if(map.containsKey(nums[i]+"")){
map.put(nums[i]+"",map.get(nums[i]+"")+ 1);
}
else map.put(nums[i]+"", 1);
}
System.out.println(map);
List<List<Integer>> data = new ArrayList<List<Integer>>();
for(String e: map.keySet()){
List<Integer> temp = new ArrayList<Integer>();
for(int i = 0;i<map.get(e);i++){
temp.add(Integer.parseInt(e));
}
data.add(temp);
}
System.out.println(data);
}
Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序)。注意,如果在映射中重新插入 键,则插入顺序不受影响。(如果在调用 m.put(k, v) 前 m.containsKey(k) 返回了 true,则调用时会将键 k 重新插入到映射 m 中。) 此实现可以让客户避免未指定的、由 HashMap(及 Hashtable)所提供的通常为杂乱无章的排序工作,同时无需增加与 TreeMap 相关的成本。使用它可以生成一个与原来顺序相同的映射副本,而与原映射的实现无关: void foo(Map m) {
Map copy = new LinkedHashMap(m);
...
}
实现代码 :
import java.util.Map;
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedHashMap;
public class ArrayTest
{
public static void main(String[] args)
{
Integer [] nums = {1,1,1,2,2,3,1,1} ;
Map<String,Integer> map = new LinkedHashMap<String,Integer>();
for(int i= 0;i<nums.length;i++){
if(map.containsKey(nums[i]+"")){
map.put(nums[i]+"",map.get(nums[i]+"")+ 1);
}
else map.put(nums[i]+"", 1);
}
System.out.println(map);
List<List<Integer>> data = new ArrayList<List<Integer>>();
for(String e: map.keySet())
{
List<Integer> temp = new ArrayList<Integer>();
for(int i = 0;i<map.get(e);i++){
temp.add(Integer.parseInt(e));
}
data.add(temp);
}
System.out.println(data);
}
}
一个循环搞定了。
Integer [] nums = {1, 2, 3, 3, 2, 1, 1, 5, 7,9, 1};
List<List> list = new ArrayList<List>();
List tempdata = new ArrayList<Integer>();
for(Integer e: mums){
if(tempdata.size()==0){
tempdata.add(e);
}
else if(tempdata.get(0)==e){
tempdata.add(e);
}
else{
list.add(tempdata);
tempdata = new ArrayList();
tempdata.add(e);
}
}
list.add(tempdata);