如何使用java 8从列表中的另一个属性中删除具有重复属性的元素?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (190)

我正在努力减少一个清单:

假设我有一个定义List<Item> listItemsItem类,例如:

public class Item {
    private String effect;
    private String value;

    public String getEffect() {
        return effect;
    }

    public void setEffect(String effect) {
        this.effect = effect;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

现在,在我的listItems列表中,我有一些具有相同effect属性的元素。

我想从listItems列表中删除具有相同effect属性的所有元素,除了value属性较高的属性。(value数字表示为a String)。

另外,我想保留所有元素的独特effect属性。

我怎样才能做到这一点?我想我将不得不处理Comparator

提问于
用户回答回答于

可以覆盖具有效果作为键的Item类中的hashCode和equals方法。这样,您的Item对象的唯一性将受效果变量控制,然后您可以将列表转储到Set对象中,该对象将根据效果变量为您提供唯一的Item值。检查此代码,

public static class Item {
    private String effect;
    private String value;

    public Item(String effect, String value) {
        this.effect = effect;
        this.value = value;
    }

    public String getEffect() {
        return effect;
    }

    public void setEffect(String effect) {
        this.effect = effect;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return String.format("value: %s, effect: %s", value, effect);
    }

    @Override
    public boolean equals(Object o) {
        if (o instanceof Item) {
            return this.getEffect() == null ? false : this.getEffect().equals(((Item) o).getEffect());
        }
        return false;
    }

    @Override
    public int hashCode() {
        return this.getEffect().hashCode();
    }
}

public static void main(String[] args) {
    System.out.println("List values");
    List<Item> list = Arrays.asList(new Item("e1", "v1"), new Item("e1", "v2"), new Item("e2", "v1"), new Item(
            "e2", "v2"), new Item("e3", "v3"));
    list.forEach(System.out::println);

    System.out.println("Set values having unique effect value");
    Set<Item> set = new HashSet<Item>(list);
    set.forEach(System.out::println);
}

运行main方法时,它给出以下输出,

List values
value: v1, effect: e1
value: v2, effect: e1
value: v1, effect: e2
value: v2, effect: e2
value: v3, effect: e3
Set values having unique effect value
value: v1, effect: e1
value: v1, effect: e2
value: v3, effect: e3

如果这对您有用,请告诉我。

用户回答回答于

似乎希望effect使用max(value)聚合作为列表中的项目分组。你可以这样做:

Map<String, Item> byEffectHavingMaxValue = listItems.stream()
    .collect(Collectors.toMap(
            Item::getEffect,      // group by effect
            Function.identity(),  // keep items as values
            BinaryOperator.maxBy( // when effect exists, keep the item with max value
                    Comparator.comparingInt(i -> Integer.parseInt(i.getValue())))));

Collection<Item> result = byEffectHavingMaxValue.values();

扫码关注云+社区

领取腾讯云代金券