【问题标题】:How this Set and Hashset and List combination working?这个 Set 和 Hashset 和 List 组合如何工作?
【发布时间】:2012-10-12 08:22:24
【问题描述】:

谁能给我解释一下这段代码,我对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)吗?

【问题讨论】:

  • 您可以通过调用 size() 方法来检查 set uniqueList 的大小。
  • 我可以建议您更好地命名变量吗?例如,您将一个集合命名为 uniqueList。一个更好的变量名会表明它是一个集合。
  • 谢谢Atul,但是现在这个帖子已经得到了太多的答案,所以如果我现在改名,如果将来有人从这个页面寻求帮助,用户会感到困惑。
  • @Sobia 我认为 Atul 的意思是您应该更改代码中的变量名称,而不是在问题中。
  • 是的,我的意思是一般做法......不是在这个问题本身。 :)

标签: java collections set hashset


【解决方案1】:

for 循环只执行 3 次,因为您的 stringList 中只有 3 个不同的值。

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

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

这是 javadoc 中最重要的部分:

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

【讨论】:

    【解决方案2】:

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

    查看此文档link

    【讨论】:

      【解决方案3】:
      Set<String> uniqueList = new HashSet<String>(al); 
      

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

      【讨论】:

        【解决方案4】:

        为什么这个循环只运行 3 次,而 "uniquelist" 包含所有成员 “字符串列表”

        不,它没有

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

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

        【讨论】:

          【解决方案5】:

          根据java spec

          在 HashSet 实现中添加方法:

          公共布尔加法(E e)

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-07-15
            • 2014-05-25
            • 2011-12-08
            • 1970-01-01
            • 2011-07-05
            • 1970-01-01
            • 2015-06-10
            • 2012-05-09
            相关资源
            最近更新 更多