学习使用不同的方法在 Java 中拆分数组。我们将学习将数组分成相等的部分,在指定的索引处和相等的长度。
copyOfRange()
创建一个与原数组相同类型的新数组,并将原数组指定范围内的项放入新数组中。请注意,此方法在内部使用 System.arraycopy() 来复制数组项。
public static T[] copyOfRange(T[] original, int from, int to)
这些是方法参数。
original
– 要从中复制范围的数组from
– 要复制的范围的初始索引,包含to
– 要复制的范围的最终索引,独占。 (该索引可能位于数组之外。)需要注意的重要一点是 to
索引可能位于数组的长度之外。此类索引位置填充有数组类型的默认值。
例如,对于 int
、long
和 double
类型,附加索引将用零填充。对于 boolean
数组,此类索引将填充为 false,对于对象数组,此类位置将填充为 null。
如果 from
大于 to
,它将抛出 IllegalArgumentException。
假设我们以这样的方式划分一个数组,我们应该得到两个定义长度的数组。在这种情况下,我们必须使用 copyOfRange() API 从原始数组创建两个新数组。
第一个新数组将包含从零开始到指定索引的项,第二个新数组将包含从指定索引到原始数组末尾的项 .
int[] original = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int givenIndex = 3;
splitArrayPart1 = Arrays.copyOfRange(original, 0, givenIndex);
splitArrayPart2 = Arrays.copyOfRange(original, givenIndex, original.length);
System.out.println(Arrays.toString(splitArrayPart1)); //[0, 1, 2]
System.out.println(Arrays.toString(splitArrayPart2)); //[3, 4, 5, 6, 7, 8, 9]
将数组分成两半与第一个示例非常相似。我们只需要自己找到拆分的位置,就是数组的中间。
int[] original = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int splitSize = original.length / 2;
int[] splitArrayPart1 = Arrays.copyOfRange(original, 0, splitSize);
int[] splitArrayPart2 = Arrays.copyOfRange(original, splitSize, original.length);
System.out.println(Arrays.toString(splitArrayPart1)); //[0, 1, 2, 3, 4]
System.out.println(Arrays.toString(splitArrayPart2)); //[5, 6, 7, 8, 9]
这有点棘手。在这里,我们必须遍历数组长度,但要以指定数量的块为单位。然后我们必须使用 copyOfRange() 方法从那些复制的项目创建新的数组实例。
如果数组平分后还有剩余项,需要特别注意。我们需要创建一个包含这些剩余项的新数组。
例如,我们的原始 数组包含 10 个项目。如果我们尝试以任何新数组不得包含超过 3 个项目的方式拆分数组。所以在这种情况下,拆分过程后将有 4 个数组。 3 个数组各有 3 个项目,第 4 个数组只有一个项目。
下面给出的是完成上述所有工作的方法。
public static <T extends Object> List<T[]> splitArray(T[] array, int splitSize) {
int numberOfArrays = array.length / splitSize;
int remainder = array.length % splitSize;
int start = 0;
int end = 0;
List<T[]> list = new ArrayList<T[]>();
for (int i = 0; i < numberOfArrays; i++) {
end += splitSize;
list.add(Arrays.copyOfRange(array, start, end));
start = end;
}
if(remainder > 0) {
list.add(Arrays.copyOfRange(array, start, (start + remainder)));
}
return list;
}
让我们用我们的原始数组测试此方法并进行划分,使得数组中最多只能有 3 个项目。
List<Integer[]> arrayParts = splitArray(ArrayUtils.toObject(original), 3);
for(Integer[] o: arrayParts) {
System.out.println(Arrays.toString(o));
}
//Output
[0, 1, 2]
[3, 4, 5]
[6, 7, 8]
[9]
在本教程中,我们学习了在 Java 中针对不同的用例拆分数组。我们学习了使用 Arrays.copyOfRange()
API 将数组拆分为任意数量的部分。
还有其他数组拆分方法,例如将数组转换为 List
并拆分列表。此类方法会创建不必要的临时变量,而不会带来任何明显的优势。
快乐学习!!
标签2: Java Array地址:https://www.cundage.com/article/split-arrays.html