2017-09-04 70 views
1

現在我有一個「龍」陣列。每個項目有兩個值。一個ID和一個計數。所以我的陣列看起來像這樣:如何檢查對象數組中對象的重複值,合併重複項的值,然後刪除重複項?

Dragon[] dragons = { new Dragon(2, 4), 
        new Dragon(83, 199), 
        new Dragon(492, 239), 
        new Dragon(2, 93), 
        new Dragon(24, 5) 
        }; 

正如你所看到的,我有兩個ID爲2的龍在數組中。我想完成的是,找到重複項時,只需將重複項的計數添加到第一項的計數中,然後刪除重複的龍。

我已經完成了這個排序成功,但我最終會在數組中間出現一個空,我不知道如何刪除null然後洗牌。

這是我迄今爲止,但它確實工作不正常:

public static void dupeCheck(Dragon[] dragons) { 
    int end = dragons.length; 
    for (int i = 0; i < end; i++) { 
     for (int j = i + 1; j < end; j++) { 
      if (dragons[i] != null && dragons[j] != null) { 
       if (dragons[i].getId() == dragons[j].getId()) {     
        dragons[i] = new Item(dragons[i].getId(), dragons[i].getCount() + dragons[j].getCount()); 
        dragons[j] = null; 
        end--; 
        j--; 
       } 
      } 
     } 
    } 
} 
+1

到目前爲止你有什麼?簡單的方法是創建一個列表,迭代你的數組,檢查ID是否存在,如果是這樣,則添加count,否則,添加對象 – Stultuske

+3

因此,這意味着'Dragon'對象的ID和人口數都是?聽起來像是一個設計缺陷... – fge

+1

如何使用ArrayList而不是數組。那麼你可以'刪除()'龍 – Tschallacka

回答

2

你應該很可能不會在龍類中爲每條龍保持龍的數量。除此之外,即使你被迫使用一個數組,你也應該創建一箇中間映射來存儲你的龍。

Map<Integer, Dragon> idToDragon = new HashMap<>(); 
for (Dragon d : yourArray) { 
    // fetch existing dragon with that id or create one if none present 
    Dragon t = idToDragon.computeIfAbsent(d.getId(), i -> new Dragon(i, 0)); 
    // add counts 
    t.setCount(t.getCount() + d.getCount()); 
    // store in map 
    idToDragon.put(d.getId(), t); 
} 

現在,地圖中包含龍的ID和龍之間的映射,並帶有正確的計數。 要創建陣列,這個地圖的,你可以

Dragon[] newArray = idToDragon.values().toArray(new Dragon[idToDragon.size()]); 
+0

太棒了。這工作很好,謝謝! – David

0

您可能力的結果存儲在一個數組,但是,這並不意味着你是力總是使用數組

一種解決方案可以是使用Stream API,組加入計數的項目,並將結果再保存到數組中。您可以通過示例說明如何使用Stream API來合計值here。將List<T>轉換成T[]非常簡單,但無論如何,你有個例子here

0

大小的數組的它的創建後,不能更改。

所以你需要返回一個新的數組或包含合併龍的列表。

public static Dragon[] merge(Dragon[] dragonArr) { 
    return Arrays.stream(dragonArr) 
      // 1. obtain a map of dragon IDs and their combined counts 
      .collect(groupingBy(Dragon::getId, summingInt(Dragon::getCount))) 
      // 2. transform the map entries to dragons 
      .entrySet().stream().map(entry -> new Dragon(entry.getKey(), entry.getValue())) 
      // 3. collect the result as an array 
      .toArray(Dragon[]::new); 
}