【问题标题】:Iterating over HashSet with for each使用 for each 遍历 HashSet
【发布时间】:2017-04-18 15:14:05
【问题描述】:

我正在尝试遍历 HashSet 的 Integer 对象,并且我想计算元素出现的次数。这是我目前的方法

public int freq(int element) {
    int numElements = 0; 

    for (int atPos : mySet){ 
       if (mySet.atPos == element){ //says atPos cannot be resolved to a field
          numElements++; 
       }
    }
    return numElements;
}

使用迭代器迭代元素会更好吗?如何修复我的

mySet.atPos 

行?

这是我初始化HashSet的地方

   private HashSet <Integer> mySet = new HashSet<Integer>();

【问题讨论】:

  • 嗯,您的atPos 是您收集的集合中的整数。假设您的集合包含3, 2, 111,那么您有三个循环,其中atPos32,最后是111。所以就做if (atPos == element)
  • 您的问题是对如何使用变量的简单误解。 int atPosmySet.atPos 不是指同一个东西。前者指的是一个局部变量,后者是寻找一个集合称为同一个东西的实例的字段的公共成员。
  • 但是...您是否意识到您将始终得到 0 或 1 作为您的 freq(...) 函数的结果?这就是集合的工作原理......
  • @KarelG 为什么我总是得到 0 或 1?对不起,如果这是一个愚蠢的问题。
  • @emmynaki 集从不包含重复项。列表可以,但集合会自动删除重复项。

标签: java iterator hashset


【解决方案1】:

Set 不能包含重复的元素。因此,element 的计数始终为 0 或 1。

对于任何集合,您可以通过以下方式获取元素的频率:

public int freq(int element) {
    return Collections.frequency(mySet, element);
}

不确定你想用它制作一个方法......

【讨论】:

    【解决方案2】:

    您的问题是对如何使用变量的简单误解。 int atPosmySet.atPos 不是指同一个东西。前者指的是一个局部变量,后者是寻找一个称为同一事物的集合实例的字段的公共成员。

    您正在尝试访问此字段:

    public class HashSet
    {
        public int atPos; //<<<
    }
    

    但是,当我们这样想时,显然HashSet中不存在该字段!

    您需要做的就是摆脱mySet.,您的代码就可以工作了。

    if (atPos == element){
        numElements++; 
    }
    

    使用迭代器遍历元素会更好吗?

    不,在这种情况下使用迭代器没有任何好处。 A for each 更具可读性。


    正如其他人所指出的,因为集合永远不会包含重复项,所以您的 numElements 实际上只会是一或零。因此,您实际上可以非常紧凑地编写函数:

    public int freq(int element) {
        if (myset.contains(element)) {
            return 1;
        }
        else {
            return 0;
        }
    }
    

    使用三元运算符甚至更好:

    public int freq(int element) {
        return myset.contains(element) ? 1 : 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      相关资源
      最近更新 更多