簡體   English   中英

在 Java 中將值從較大的數組復制到較小的數組

[英]Copy values from a larger size array to a smaller size array in Java

我有一個包含這些值的數組: {0, 1, 3, 2, 3, 0, 3, 1}

我想調用一個靜態 void remove() 函數,該函數從原始數組中刪除所有 #3 值。 我創建了一個新數組,並且具有較小的數組大小,以適合我需要復制的數字。 我循環遍歷兩個數組以復制非 #3 值,但不斷獲取ArrayIndexOutOfBoundsException ,其中last destination index 6 out of bounds for int[5]

我相信這個邏輯是正確的,本質上,您如何將值從較大的數組復制到較小的數組? 我是否缺少另一個數組來復制值?

import java.util.Arrays;

public class Main {
    public static int[] remove(int v, int[] in) {
        int size = 0;
        for (int i=0; i<in.length; i++) {
            if (in[i] != v) {
                size++;
            }
        }
        int[] pushArray = new int[size];
        for (int j=0; j<pushArray.length; j++) {
            for (int i=0; i<in.length; i++) {
                if (in[i] == v) {
                    continue;
                } else {
                    System.arraycopy(in, in[i], pushArray, pushArray[i], pushArray.length);
                }
            }
        }
        return pushArray;
    }
    
    public static void main(String args[]) {
        System.out.println("Values from array: ");
        int[] intArray = new int[] {0, 1, 3, 2, 3, 0, 3, 1};
        System.out.println(Arrays.toString(intArray));
        
        int v = 3;
        
        System.out.println("Removing all values of " + v + " from array above ^");
        
        int[] newArray = remove(v, intArray);
        System.out.println(Arrays.toString(newArray));
    }
}

System.arraycopy不會將一個元素從一個數組復制到另一個,它

從指定的源數組復制一個數組,從指定位置開始,到目標數組的指定位置。數組組件的子序列從 src 引用的源數組復制到 dest 引用的目標數組。 復制的組件數等於長度參數。 源數組中位置 srcPos 到 srcPos+length-1 處的組件分別復制到目標數組的位置 destPos 到 destPos+length-1。

意味着它從源數組中復制連續的元素,從 srcPos 開始,並將它們按照它們所在的順序放入目標數組中,從 destPos 開始。

您可以通過簡單地將 pushArray[j] 的值設置為 in[i] 來完成您想要做的事情,而無需嵌套循環:

public static int[] remove(int v, int[] in) {
    int size = 0;
    for (int i = 0; i < in.length; i++) {
        if (in[i] != v) {
            size++;
        }
    }
    int[] pushArray = new int[size];

    int j = 0;
    for (int i = 0; i < in.length; i++) {
        if (in[i] != v) {
            pushArray[j++] = in[i];
        }
    }
    return pushArray;
}

輸出 :

Values from array: 
[0, 1, 3, 2, 3, 0, 3, 1]
Removing all values of 3 from array above ^
[0, 1, 2, 0, 1]

嘗試這個。

public static int[] remove(int v, int[] in) {
    return IntStream.of(in)
        .filter(i -> i != v)
        .toArray();
}

public static void main(String[] args) {
    int[] in = {0, 1, 3, 2, 3, 0, 3, 1};
    int[] out = remove(3, in);
    System.out.println(Arrays.toString(out));
}

輸出:

[0, 1, 2, 0, 1]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM