[英]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.