任何人都可以向我解释这段代码,我对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
)?
答案 0 :(得分:12)
for循环只执行三次,因为stringList
中只有3个不同的值。
Set
不允许重复输入。 Set
检查.equals()
条目,对于两个重复条目,true
为uniqueList
。因此,"1"
中只有三个元素,即:"2"
,"3"
和"2".equals("2")
。
请注意,true
为e1
。
这是javadoc最重要的部分:
不包含重复元素的集合。更正式地说,集合不包含
e2
和e1.equals(e2)
元素对,{{1}},最多只有一个null元素。
答案 1 :(得分:7)
Set
是Collection
,不包含重复元素。由于您的数组仅包含1,2和3作为唯一元素,因此您的集合将仅包含3个元素。
请查看此文档link。
答案 2 :(得分:4)
为什么这个循环只运行3次而“uniquelist”拥有所有成员 of“StringList”
不,不。
如果您使用Mathematical
的一般 Set
定义,则设置是unique
值的集合。他们不能重复。
在Java中也是如此(实际上在任何地方),因此当您将List
转换为Set
时,所有Duplicate
值都为filtered out
。仅保留unique
个值。
答案 3 :(得分:4)
根据java spec:
在HashSet实现中添加方法:
public boolean add(E e)
如果指定的元素尚不存在,则将其添加到此集合中。 更正式地说,如果设置,则将指定的元素e添加到此集合中 不包含元素e2(e == null?e2 == null:e.equals(e2))。 如果此集合已包含该元素,则该调用将离开该集合 不变并返回false。
答案 4 :(得分:4)
Set<String> uniqueList = new HashSet<String>(al);
由于Set
不允许重复,因此在执行此语句之后
uniqueList
包含"1"
,"2"
和"3"
元素。