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

smtd7mpg  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(413)

现在我有一个“龙”的阵列。每个项目有两个值。一个身份证和一个号码。所以我的数组看起来像这样:

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

如你所见,我有两条id为2的龙。我想完成的是,当发现一个复制品时,只需将复制品的数量加到第一个复制品的数量上,然后移除复制品。
我已经成功地做到了这一点,但是我会在数组的中间有一个空值,我不知道如何删除空值然后洗牌它们。
到目前为止,我已经做到了这一点,但它确实不能正常工作:

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--;
                }
            }
        }
    }
}
e0bqpujr

e0bqpujr1#

您可能被迫将结果存储在数组中,但这并不意味着您必须始终使用数组
一种解决方案是使用 Stream api,将项目分组并添加计数,然后将结果再次保存到数组中。您可以获得如何使用 Stream api在此处求和。转换 List<T> 变成一个 T[] 这很简单,但无论如何,你这里有一个例子

368yc8dk

368yc8dk2#

您很可能不应该维护dragon类本身中每个龙的龙数。
除此之外,即使你被迫使用一个数组,你也应该创建一个交互Map来存储你的龙。

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);
}

现在Map包含了龙的ID和龙之间的Map,以及正确的计数。要从这个Map创建一个数组,您可以

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

sshcrbum3#

数组的大小在创建后不能更改。
因此,您需要返回一个新数组或包含合并龙的列表。

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);
}

相关问题