Set是一种无序集合,与List不同,它保证不包含任何重复值。
Set接口的泛型类型参数表示Set中元素的类型:
Set<Integer> ints = Set.of(1, 2, 3);
Set<String> strings = Set.of("alpha", "beta", "gamma");
Set<Object> mixed = Set.of(1, false, "foo");
注意,Set.of()方法创建的是一个不可修改的Set实例。
在这个实例上调用add、remove这类方法,会在运行时抛出异常。
要创建可修改的Set,需要实例化一个实现了Set接口的类。
实现该接口最常用的内置类是HashSet类。
Set<Integer> ints = new HashSet<>();
Set接口继承自Collection和Iterable接口,因此与其他类型的集合共享很多方法。
不过,与Collection接口的一个显著区别是,add、remove这类方法返回的是boolean(而不是void),用来表示调用该方法时集合中是否包含该项:
Set<Integer> set = new HashSet<>();
set.add(1);
// => true
set.add(2);
// => true
set.add(1);
// => false
set.size();
// => 2
set.contains(1);
// => true
set.contains(3);
// => false
set.remove(3);
// => false
set.remove(2);
// => true
set.size();
// => 1
你对 Blorkemon™️ 卡牌的怀旧之情丝毫没有减弱的迹象,你甚至又开始收集它们了,还拉上朋友们一起加入。
在这个练习中,你将使用Set接口来管理你的收藏,因为当目标是集齐所有已存在的卡牌时,重复的卡牌并不重要。
你刚找到了自己以前囤的 Blorkemon™️ 卡牌! 这堆卡牌里有很多重复的,所以是时候去掉重复的,建立一个新的收藏了。
你非常希望朋友们也加入你的 Blorkemon™️ 狂热,最好的办法就是送他们一张卡牌,帮他们开启自己的收藏。
实现newCollection方法:它接收一个卡牌数组,返回一个代表新收藏的Set。
GottaSnatchEmAll.newCollection(List.of("Newthree", "Newthree", "Newthree"));
// => {"Newthree"}
一旦有了收藏,它就有了自己的生命,需要不断扩充。
实现addCard方法,它接收一张新卡牌和你当前已收集的卡牌集合。
如果这张新卡牌还不在收藏里,方法应该把它加进去,并返回一个boolean,表示收藏是否被更新。
Set<String> collection = GottaSnatchEmAll.newCollection("Newthree");
GottaSnatchEmAll.addCard("Scientuna",collection);
// => true
collection.contains("Scientuna");
// => true
你非常希望朋友们也加入你的 Blorkemon™️ 狂热,所以是时候开始交换了!
和朋友交换时,并不是每笔交易都值得做,有些甚至根本做不成。 只有当你和朋友各自都有一张对方没有的卡牌时,才应该交换。
实现canTrade方法,它接收你当前的收藏和你某位朋友的收藏。
按照上面的规则,它应该返回一个boolean,表示是否可以进行交换。
Set<String> myCollection = Set.of("Newthree");
Set<String> theirCollection = Set.of("Scientuna");
GottaSnatchEmAll.canTrade(myCollection, theirCollection);
// => true
你和热爱 Blorkemon™️ 的朋友们聚在一起,想知道哪些卡牌最常见。
实现commonCards方法,它接收一个收藏数组,返回一个包含所有收藏都有的卡牌的集合。
GottaSnatchEmAll.commonCards(List.of(Set.of("Scientuna"), Set.of("Newthree","Scientuna")));
// => {"Scientuna"}
你和朋友们加起来,拥有所有的 Blorkemon™️ 卡牌吗?
实现allCards方法,它接收一个收藏数组,返回一个包含所有收藏中全部不同卡牌的集合。
GottaSnatchEmAll.allCards(List.of(Set.of("Scientuna"), Set.of("Newthree","Scientuna")));
// => {"Newthree", "Scientuna"}