我有一个包含以下内容的ArrayList-CHENNAI,MUMBAI,DELHI,CHENNAI,DELHI,CHENNAI。另外,假设将这3个城市名称定义为ENUM,并针对每个城市指定一个值。 (CHENNAI = 1,MUMBAI = 2和DELHI = 3)

在Java 8 Streams中,我能够计算城市值的总和,在这种情况下,城市值的总和将为1 + 2 + 3 + 1 + 3 + 1 = 11。

我的问题是,如果还有其他条件说,如何为同一ArrayList计算城市值的总和,

如果城市名称出现两次,则只能添加一次。即在这种情况下,CHENNAI出现了3次。因此,将其值相加时,我们应仅考虑1(对于前2次出现)+1 = 2而不是3。类似地,DELHI出现2次。因此,德里的价值应该只取一次。
因此,最终结果将是2 + 2 + 3 = 7,而不是我之前解释的11。

请帮助如何在Java 8中实现此目标

最佳答案

映射到您的枚举,并在计算总和之前使用.distinct()过滤出重复项。

根据将enum映射到int的方式,可以尝试:

List<String> cities = ...
int sum = cities.stream()
    .map(CityEnum::valueOf)
    .distinct()
    .mapToInt(CityEnum::ordinal)
    .sum();

09-10 23:45