如何解决Java - 将数组分组为更小的数组
这让我费解,想知道我是否可以得到建议。
子列表的分组将取决于原始组的大小,该大小会有所不同。 但如果我有这个:
[0,1,2,3,4,5,6,7,8,9,10,11]
我需要将这些分组到此
[0,8]
[1,9]
[2,10]
[3,11]
如果我有这个:
[0,7]
我需要像这样将它分成 4 个:
[0,4]
[1,5]
[2,6]
[3,7]
我需要找到每个较小组中最小的一个,但我可以处理。
已编辑:抱歉忘了提到这每次显示 4 个数组,但它可能是 3 或 5 或其他值。 我认为这让事情变得更加复杂。
解决方法
变量
分组算法中有两个变量
- 输入数组的大小
- 组数(或每组元素数)
行为
- 根据输入参数对输入数组进行分组
- 如果数组的大小不是组数的精确倍数,则某些组的计数可能与其他组不同
算法(假设给定了组数(N
)
- 初始化列表列表(外部列表将包含
N
个列表) - 迭代输入数组
- 令输入数组的当前索引为
i
- 将元素添加到
i % N
th 列表作为list.get(i % N).add(input[i])
代码
public List<List<Integer>> group(int[] input,final int groupCount) {
List<List<Integer>> groups = IntStream.range(0,groupCount)
.mapToObj(i -> new ArrayList<Integer>())
.collect(Collectors.toList());
for (int i = 0; i < input.length; i++) {
groups.get(i % groupCount).add(input[i]);
}
}
,
所以基本上:您想每次将一个数组拆分为四个数组?
然后您可以执行以下操作:
public static List<Integer[]> getSubArrays(int[] target,int numberOfArrays)
{
System.out.println("+++");
List<Integer[]> arrays = new ArrayList<>();
for(int i = 0; i<numberOfArrays; i++)
{
Integer[] partArray = new Integer[target.length/numberOfArrays];
int itt = 0;
for(int b = i; b<target.length; b=b+numberOfArrays)
{
partArray[itt++] = target[b];
}
System.out.println(Arrays.deepToString(partArray));
arrays.add(partArray);
}
return arrays;
}
public static void main(String[] args)
{
int[] firstArray = {0,1,2,3,4,5,6,7,8,9,10,11};
int[] secondArray = {0,7};
int[] thirdArray = {0,3};
int[] unequalArray = {0,4};
getSubArrays(firstArray,4);
getSubArrays(secondArray,4);
getSubArrays(thirdArray,4);
getSubArrays(unequalArray,4);
}
输出:
+++
[0,8]
[1,9]
[2,10]
[3,11]
+++
[0,4]
[1,5]
[2,6]
[3,7]
+++
[0]
[1]
[2]
[3]
+++
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
at Test.getSubArrays(Test.java:18)
at Test.main(Test.java:41)
,
这里有三个解决方案,第一个是针对 list
的 lists.
第二个是针对 array
的 arrays
。如果提供的数组长度不是组大小的整数倍,每个方法都会抛出异常。
第三种方法允许组大小的非整数倍。
所有方法都利用嵌套的 streams
来创建所需的结果。
int[] v = { 0,11 };
List<?> lists = groupLists(v,4);
for (Object o : lists) {
System.out.println(o);
}
int[][] vals = groupArrays(v,4);
for (int[] o : vals) {
System.out.println(Arrays.toString(o));
}
以上两种打印
[0,11]
返回列表的方法
public static List<List<Integer>> groupLists(final int[] vals,final int groupSize) {
if (vals.length % groupSize != 0) {
throw new IllegalArgumentException(
"Array length not a multiple of group size");
}
return IntStream.range(0,groupSize)
.mapToObj(i -> IntStream
.range(0,vals.length / groupSize)
.mapToObj(k -> Integer
.valueOf(vals[k * groupSize + i]))
.collect(Collectors.toList()))
.collect(Collectors.toList());
}
返回数组的方法
public static int[][]
groupArrays(final int[] vals,groupSize).mapToObj(
i -> IntStream.range(0,vals.length / groupSize).map(
k -> Integer.valueOf(vals[k * groupSize + i]))
.toArray())
.toArray(int[][]::new);
}
此方法通过使用过滤器尽可能地填充返回的列表,以避免产生索引越界异常。
int[] v = { 0,9};
List<?> lists = groupListsPartial(v,4);
for (Object o : lists) {
System.out.println(o);
}
印刷品
[0,7]
方法
public static List<List<Integer>> groupListsPartial(final int[] vals,final int groupSize) {
return IntStream.range(0,(vals.length+(groupSize-1)) / groupSize)
.filter(k->k*groupSize + i <vals.length)
.mapToObj(k -> Integer
.valueOf(vals[k * groupSize + i]))
.collect(Collectors.toList()))
.collect(Collectors.toList());
}
,
我相信我有办法根据组数是 4 还是其他来做到这一点。
i++ // in an outer loop
.....................
ArrayList compareSet = new ArrayList();
int nCrement = 0;
int nX = 4; // is 4 right now but could be something else
for (int j = 0; j < listSet.size(); j++) {
String value = (String) listSet.get(i + nCrement); // i is increased above
compareSet.add(value);
nCrement = nCrement + nX;
j = nCrement;
}
..........
// compareSet checks each group to see which is smallest then continues outer loop to get another group
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。