2017-09-04 67 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); 
}