如何检查对象数组中对象的重复值,合并重复项的值,然后删除重复项?

时间:2017-09-04 07:28:10

标签: java arrays sorting object duplicates

现在我有一系列“龙”。每个项目都有两个值。 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的Dragons。我想要完成的是,当找到副本时,只需将副本的计数添加到第一个副本的计数中,然后删除重复的Dragon。

我已经成功完成了,但是我最终会在数组中间出现一个null,我不知道如何删除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--;
                }
            }
        }
    }
}

3 个答案:

答案 0 :(得分: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);
}

现在,地图包含龙ids和龙之间的映射,并具有正确的计数。 要从此地图创建数组,您只需

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

答案 1 :(得分:0)

您可能会强制将结果存储在数组中,但这并不意味着您强行使用始终使用数组

一种解决方案可能是使用Stream API,将添加计数的项目分组并再次将结果保存到数组中。您可以举例说明如何使用Stream API对值here求和。将List<T>转换为T[]非常简单,但无论如何,您有一个示例here

答案 2 :(得分: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);
}