【问题标题】:Iteratively split an array to subarrays according to a given length [duplicate]根据给定的长度迭代地将数组拆分为子数组[重复]
【发布时间】:2021-10-16 05:47:31
【问题描述】:

如何在 Java 中创建数组的子数组。给定数字 3 和 x [2,4,6,30,9],答案是 X1[2,4,6] X2[4,6,30] X3[6,30,9]

这是我目前所拥有的,但它只打印前三个元素。 我还必须打印每个子数组的中位数。


double[] floatsArr = new double[3]; 

// floats is the array with all the elements in

for(int i = 0; i < floats.length; i++){
            
     for(int k = 1; k < (filterSize+1); k++){
                 floatsArr[k] = floats[k];  
                 System.out.println(floatsArr[k]);

    }
}

【问题讨论】:

标签: java arrays loops


【解决方案1】:

您似乎想从一个数组中创建给定长度的所有子数组。

您可以手动完成:

static double[][] subArrays(double[] arr, int k)
{
    double[][] subArrs = new double[arr.length-k+1][k];
    
    for(int i=0; i<subArrs.length; i++)
        for(int j=0; j<k; j++)
            subArrs[i][j] = arr[i+j];
    
    return subArrs;
}

或者使用内置方法Arrays.copyOfRange

static double[][] subArrays(double[] arr, int k)
{
    double[][] subArrs = new double[arr.length-k+1][];
    
    for(int i=0; i<subArrs.length; i++)
        subArrs[i] = Arrays.copyOfRange(arr, i, i+k);
    
    return subArrs;
}

测试:

double[] arr = {2, 4, 6, 30, 9};
    
for(double[] subArr : subArrays(arr, 3))
    System.out.println(Arrays.toString(subArr));

输出:

[2.0, 4.0, 6.0]
[4.0, 6.0, 30.0]
[6.0, 30.0, 9.0]

【讨论】:

  • 非常感谢!但是我希望输出为双精度,以便我可以对其进行排序并找到中位数
【解决方案2】:

这是一种方便的方法。

给定一组子数组大小和源数组

int groupSize = 3;
double[] arr = { 2, 4, 6, 30, 9 };
  • 来自0 to arr.length - groupSize 的第一个流整数。这将作为开始 创建每个子数组的索引。
  • 然后流式传输源数组的实际索引以创建子数组。
  • 并使用前一个索引将双精度值映射到流中,然后收集到一个数组中。
  • 然后将这些数组收集到一个多数组数组中。
double[][] result =
        IntStream.rangeClosed(0, arr.length - groupSize)
                .mapToObj(i -> IntStream.range(i, groupSize + i)
                        .mapToDouble(k -> arr[k]).toArray())
                .toArray(double[][]::new);


for (double[] a : result) {
    System.out.println(Arrays.toString(a));
}

打印

[2.0, 4.0, 6.0]
[4.0, 6.0, 30.0]
[6.0, 30.0, 9.0]

更短的方法是使用Arrays.copyOfRange() 代替第二个流。

double[][] result = IntStream
        .rangeClosed(0, arr.length - groupSize)
        .mapToObj(i -> Arrays.copyOfRange(arr, i, i + groupSize))
        .toArray(double[][]::new);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多