在 Java 中拆分数组

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(266)   2023-06-26 07:54:18

学习使用不同的方法在 Java 中拆分数组。我们将学习将数组分成相等的部分,在指定的索引处和相等的长度。

1. Arrays.copyOfRange() API

copyOfRange() 创建一个与原数组相同类型的新数组,并将原数组指定范围内的项放入新数组中。请注意,此方法在内部使用 System.arraycopy() 来复制数组项。

public static T[] copyOfRange(T[] original, int from, int to)

这些是方法参数。

  • original – 要从中复制范围的数组
  • from – 要复制的范围的初始索引,包含
  • to – 要复制的范围的最终索引,独占。 (该索引可能位于数组之外。

需要注意的重要一点是 to 索引可能位于数组的长度之外。此类索引位置填充有数组类型的默认值。

例如,对于 intlongdouble 类型,附加索引将用零填充。对于 boolean 数组,此类索引将填充为 false,对于对象数组,此类位置将填充为 null

如果 from 大于 to,它将抛出 IllegalArgumentException

2.指定索引拆分数组

假设我们以这样的方式划分一个数组,我们应该得到两个定义长度的数组。在这种情况下,我们必须使用 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]

2. 将数组分成两等份

将数组分成两半与第一个示例非常相似。我们只需要自己找到拆分的位置,就是数组的中间

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]

3.将数组拆分为N个部分

这有点棘手。在这里,我们必须遍历数组长度,但要以指定数量的块为单位。然后我们必须使用 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]

4.总结

在本教程中,我们学习了在 Java 中针对不同的用例拆分数组。我们学习了使用 Arrays.copyOfRange() API 将数组拆分为任意数量的部分。

还有其他数组拆分方法,例如将数组转换为 List 并拆分列表。此类方法会创建不必要的临时变量,而不会带来任何明显的优势。

快乐学习!!

标签2: Java Array
地址:https://www.cundage.com/article/split-arrays.html

相关阅读

使用 array clone、System.arrayCopy() 和 Arrays.copyOf() 方法将一个数组复制到另一个数组对象的 Java 示例。 请注意,下面给出的所有方法都会创建...
从数组创建子数组的 Java 示例,即创建数组切片。学习使用 Java 8 Arrays.copyOfRange() 方法,以及将 子数组转换为 List 对象。 String[] names ...
通过示例学习在 Java 中创建数组的深拷贝。我们将使用 Apache Commons Lang 库及其实用方法 SerializationUtils.clone( array ) 到 arra...
学习使用 HashSet 类。交集是属于两个不同集合的一组共同项目。 路口 要获取两个数组的交集,请按照下列步骤操作: 将第一个数组推送到 HashSet 实例中。 使用retainAll()方...
学习检查数组是否包含元素。另外,学习查找数组中元素的索引。 2. 使用数组类 要检查元素是否在数组中,我们可以使用 Arrays类将数组转换为 ArrayList 并使用 contains() ...
学习使用不同的方法在 Java 中拆分数组。我们将学习将数组分成相等的部分,在指定的索引处和相等的长度。 1. Arrays.copyOfRange() API copyOfRange() 创建...
Learn to 将 byte[] 数组转换为字符串 and 将 String 转换为 byte[] 数组 in Java with examples. Conversion between b...
学习使用不同的技术及其差异来声明和初始化数组。除了直接访问数组外,我们还将使用 java.util.Arrays 和 Stream API,它们提供了几种在 Java 中处理数组的有用方法。 请...
数组是固定大小的数据结构,数组大小一旦初始化就不能更改。但是,在需要更改数组大小的情况下,我们必须遵循本教程中给出的方法之一。 1. 使用 java.util.Arrays.copyOf() c...
学习从数组中查找、计算和删除所有重复元素 在 Java 中使用 Streams、地图和设置 来自集合框架。 我们将使用以下 Integer 值数组。其他数据类型的逻辑也是一样的。 1. 使用 S...