3

谁能向我解释一下这段代码,我没有太多的编码经验,Collections所以我很难理解这些 LOC。

String[] stringList ={"1","2","1","1","2","3","2","3","2","1"}; 
List<String> al =Arrays.asList(stringList); 
Set<String> uniqueList = new HashSet<String>(al); 
for (String strCount :uniqueList) { 
     System.out.println(strCount + ": " + Collections.frequency(al, strCount)); 
} 

为什么这个循环只运行 3 次,而uniquelist拥有stringList. 循环不应该运行 10 次(长度uniqueList)吗?

4

5 回答 5

12

for 循环只执行 3 次,因为在你的stringList.

ASet不允许重复条目。带有的Set检查条目.equals(),这将是true两个重复的条目。因此, 中只有三个元素uniqueList,即"1""2""3"

注意,"2".equals("2")就是true.

这是 javadoc 中最重要的部分:

不包含重复元素的集合。更正式地说,集合不包含一对元素e1e2这样的e1.equals(e2),并且最多包含一个空元素。

于 2012-10-12T08:24:33.950 回答
7

ASetCollection不包含重复元素的 a。由于您的数组仅包含 1、2 和 3 作为唯一元素,因此您的 Set 将仅包含 3 个元素。

检查此文档链接

于 2012-10-12T08:25:16.573 回答
4

为什么这个循环只运行 3 次,而“uniquelist”拥有“StringList”的所有成员

不,它没有

如果您使用Mathematicala 的一般定义Set,则Setunique值的集合。他们不能有重复。

Java 中也是如此(实际上在任何地方),所以当您将您转换List为 aSet时,所有Duplicate值都是filtered out. 仅unique保留值。

于 2012-10-12T08:28:07.227 回答
4

根据java规范

在 HashSet 实现中添加方法:

公共布尔加法(E e)

如果指定的元素尚不存在,则将其添加到此集合中。更正式地说,如果此集合不包含元素 e2,则将指定的元素 e 添加到此集合中,使得 (e==null ? e2==null : e.equals(e2))。如果该集合已包含该元素,则调用将保持该集合不变并返回 false。

于 2012-10-12T08:28:57.827 回答
4
Set<String> uniqueList = new HashSet<String>(al); 

AsSet不允许重复,因此在执行此语句后, uniqueList包含元素"1","2""3".

于 2012-10-12T08:36:37.413 回答