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

时间:2016-11-01 21:23:21

标签: java arrays

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

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的新手。

5 个答案:

答案 0 :(得分:2)

  1. 使用循环确定目标数组的大小
  2. 创建所需大小的目标数组
  3. 使用第二个循环将值放入目标数组
  4. 如果没有第一步,您就无法知道数组的正确大小。如果你创建一个甚至一个元素太小或一个元素两个大的数组,这将是一个浪费, 因为您将被迫创建第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;
    }
    

答案 1 :(得分:2)

您是否可以使用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);

答案 2 :(得分:2)

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;
}

答案 3 :(得分:0)

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

或者,使用Java 8,您可以将其编写为流一行:

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

答案 4 :(得分:0)

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

k

返回适当大小的数组。在这种情况下,您可以摆脱 data concatenation; length dset source $50.; set CURR_CURR CURR_30 indsname=source; dset=source; run; 。 ArrayList在内部使用数组,但如果需要更多空间,则会自动调整大小,因此您不必进行微管理。如果传入的数组不够大,ArrayList上的toArray方法将返回一个适当大小的新数组。你看到的一个常见的事情就是将一个大小为0的数组传入toArray,这意味着返回的值将始终是正确大小的数组。