簡體   English   中英

僅使用 for 循環組合兩個沒有重復的 int 數組

[英]Combine two int arrays without duplicates using only for loops

這是一個相當不錯的初學者作業,我很想得到一些關於我的代碼的幫助。

我需要使用 for 循環將兩個整數數組合並為一個,並確保我沒有重復。 我用谷歌搜索的任何東西都非常復雜,並且使用了各種內置方法。

這是我的代碼:

static void SumArray(){
        int[] array1 = { 1, 2, 3 };
        int[] array2 = { 3, 4, 5 };
        int[] merged = new int[array1.length + array2.length];
        int pos = 0;

        for (int i = 0; i < array1.length; i++) {
            merged[pos] = array1[i];
            pos++;
        }
        for (int j = merged[pos]; j < array2.length; j++) {
            if (merged[pos] != array2[j]) {
                merged[pos] = array2[j];
                pos++;
            }
        }
        System.out.println(Arrays.toString(merged));

最終,它應該返回{1, 2, 3, 4, 5} 相反,當前它返回1, 2, 3, 3, 4, 5

我想知道為什么我的if不起作用。 它應該跳過 3,因為它已經在那里了。

我錯過了什么?

謝謝 :)

編輯:

謝謝大家,這就是我最終做的,這仍然不好,因為我沒有在第一個數組的第一個循環中檢查重復項:

    static void SumArray(){
        int[] array1 = { 1, 2, 3 };
        int[] array2 = { 3, 4, 5 };
        int arrSize = array1.length + array2.length;
        int[] merged = new int[arrSize];
        int pos = 0;
        int counter = 0;

        for (int i = 0; i < array1.length; i++) {
            merged[pos] = array1[i];
            pos++;
        }
        for (int j = merged[pos]; j < array2.length; j++) {
            if (merged[pos-1] != array2[j]) {
                merged[pos] = array2[j];
                pos++;
                counter++;
            }
        }

        int[] newMerged = new int[arrSize - counter + 1];
        System.arraycopy(merged, 0, newMerged, 0, newMerged.length);
        System.out.println(Arrays.toString(newMerged));
        }

我相信我會找到辦法的。

我想知道為什么我的if不起作用。

因為merged[pos]始終為 0,因為您從未在代碼中為其分配任何其他值。 創建數組時,數組條目被初始化為零。

您不能只檢查一個條目就知道是否從array2添加一個值。 您必須檢查您編寫的所有條目,並在第二個for循環中使用嵌套循環。 如果新條目尚不存在,則僅添加新條目。

請注意,您還需要提前檢查有多少重復項,以便您知道merged長度應該只有 5 個條目,或者您需要在知道應該多長時間后重新創建merged 否則,您的最終結果將是{1, 2, 3, 4, 5, 0} ,而不是{1, 2, 3, 4, 5}

這是 Java 8 及更大版本的解決方案:

int[] first = { 1, 2, 3 };
int[] second = { 3, 4, 5 };
int[] merged = Stream.of(first, second)
            .flatMapToInt(Arrays::stream)
            .distinct()
            .toArray();

由於第一個 for 循環中的“pos++”,因為您在第二個循環中用作 j 的起始索引。 您的 3 在索引 2 中,並且您正在將它與索引 3 進行比較,后者永遠不會相等

這是你的答案:

int[] array1 = { 1, 2, 3 };
int[] array2 = { 3, 4, 5 };
int[] merged = new int[array1.length + array2.length];
    int pos = 0,i=0, j;

    Set<Integer> intSet = new HashSet();

    for (i = 0; i < array1.length; i++) {
        if(!intSet.contains(array1[i])) {
        merged[pos] = array1[i];
        intSet.add(Integer.valueOf(i));
        pos++;

        }
    }

    for (j= 0, pos = pos-1; j < array2.length; ) {
        if(!intSet.contains(Integer.valueOf(array2[j]))) {
            merged[pos] = array2[j];
            intSet.add(Integer.valueOf(i));
            pos++;
            j++;
        }
    }
    System.out.println(Arrays.toString(merged));

暫無
暫無

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

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