gpt4 book ai didi

java - 为什么ImmutableSet允许重复,而ImmutableMap不允许

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:43:31 24 4
gpt4 key购买 nike

我注意到(并赞赏!)Guava 的 ImmutableMap.Builder 如果已将重复键添加到构建器,则无法构建。然而,相同的行为(添加重复元素)在 ImmutableSet 中成功。

这种差异有什么原因吗?有什么好的方法可以构造具有相同故障行为的ImmutableSet

测试用例:

import static org.testng.Assert.*;
import org.testng.annotations.Test;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;

public class ImmutableDuplicatesTest
{
@Test(expectedExceptions=IllegalArgumentException.class) // Note failure
public void mapDuplicates() {
ImmutableMap.Builder<String, String> map = ImmutableMap.builder();
map.put("a", "a");
map.put("b", "b");
map.put("a", "c");
assertEquals(map.build().size(), 2);
}

@Test // Passes normally
public void setDuplicates() {
ImmutableSet.Builder<String> set = ImmutableSet.builder();
set.add("a");
set.add("b");
set.add("a");
assertEquals(set.build().size(), 2);
}
}

最佳答案

是的,这种行为是故意的。这是一种思考方式:Set 经常从其他 Collection 创建,尤其是 List,它们可能有重复项。如果可能存在重复,要求用户编写 ImmutableSet.copyOf(Sets.newHashSet(element)) 会非常尴尬且效率低下。另一方面,Map 通常是从其他 Map 构建的,它们不能有重复的键。

如果你想禁止重复元素,你最好的选择是

Set<E> set = new LinkedHashSet<E>();
for (E e : input) {
if (!set.add(e)) {
throw new IllegalArgumentException();
}
}
return ImmutableSet.copyOf(set);

关于java - 为什么ImmutableSet允许重复,而ImmutableMap不允许,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19773911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com