繁体   English   中英

如何在Java中仅将一个数组的某些元素复制到另一个

[英]How to copy only certain elements of one Array to another in Java

我正在努力根据已设置的参数创建大小正确的数组。 长话短说,该程序正在处理第一个数组中的一定数量的元素。 这些要素如下

int [] myWeights = {258, 58, 209, 91, 79, 182, 172, 27, 7, 29, 128, 198};

现在这些元素以盎司为单位。 我得到了可以正确运行所有程序的程序,现在我的教授希望我们将超过8磅的程序分成一个新数组。 在这种情况下,新数组中的那些元素是258、209、182、172和198。问题是程序在开始时可以创建一个随机大小的数组,其大小在数字1-320之间。 有没有一种方法可以使某种循环实例化所需数量的“盒子”。 还是我只是应该实例化一些任意数字,并希望这是我所需要的? 我目前的代码是

public static int [] overGivenPounds(int x, int [] array){
    int pounds = 0;
    int arrayLength = 0;
    int arrayOverEightPounds[];
    int k = 0;
    for(int i = 0; i < array.length; i++){
        pounds = array[i] / 16;

        if(x < pounds){
            arrayOverEightPounds[k] = array[i];
            k++;         

        }
    }
    return arrayOverEightPounds;

如果其中任何一个不清楚,请询问,没有必要粗鲁。 我对Java非常陌生。

  1. 使用循环来确定目标数组的大小
  2. 创建所需大小的目标数组
  3. 使用第二个循环将值放入目标数组

没有第一步,您将无法知道数组的正确大小。 如果创建的数组甚至是一个元素太小或一个元素两个太大,那将是浪费,因为您将被迫创建第三个数组以返回正确大小的数组。

因此,您的解决方案应类似于:

public static int[] overGivenPounds(int x, int[] array) {
    int size = 0;

    for (int value : array) {
        if (satisfies(x, value)) {
            size++;
        }
    }

    int[] result = new int[size];
    // ??? -> for you to complete this
    for (int value : array) {
        if (satisfies(x, value)) {
            // ??? -> for you to complete this
        }
    }

    return result;
}

您可以使用Java流吗? 如果是这样,解决方案将是:

return Arrays.stream(myWeights).filter(n -> n/16 > x).toArray();

如果没有,则可以使用Arrays.copyOf创建正确长度的数组:

int[] heavyWeights = int[myWeights.length];
int size = 0;
for (int weight: myWeights)
    if (weight / 16 > x)
        heavyWeights[size++] = weight;
return Arrays.copyOf(heavyWeights, size);
public static int[] overGivenPounds(int x, int[] array){        
    Arrays.sort(array);
    boolean foundSomething = false;
    int startIndex = 0;
    for (int i = 0; i < array.length; i++) {        
        if(array[i]/16>=x){
            startIndex = i;
            foundSomething = true;
            break;
        }
    }
    if(foundSomething)
        return Arrays.copyOfRange(array, startIndex, array.length);
    return null;
}

通常的方法是创建一个可以容纳所有内容的数组,将项目添加到该数组中,同时跟踪已添加的项目数。 最后,您返回数组的副本,该副本被截断为项目数。

或者,使用Java 8,您可以将它编写为流式的一排:

return Arrays.stream(array).filter(i -> (i / 16) > x).toArray();

您可以使用其他课程吗? 如果是这样,您可以使用ArrayList然后使用

//int arrayOverEightPounds[];
List<Integer> listOverEightPounds = new ArrayList<>();

//...

    //arrayOverEightPounds[k] = array[i];
    listOverEightPounds.add(array[i]);

//....

return listOverEightPounds.toArray(new Integer[0]);

返回适当大小的数组。 在这种情况下,您可以摆脱k ArrayList在内部使用一个数组,但是如果需要更多空间,它将自动调整其大小,因此您不必进行微管理。 如果传入的数组不够大,则ArrayList上的toArray方法将返回适当大小的新数组。 您看到的常见现象是将大小为0的数组传入toArray,这意味着返回的值将始终是大小正确的数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM