【问题标题】:Relative frequency in javajava中的相对频率
【发布时间】:2013-01-11 12:21:50
【问题描述】:

我想创建一个程序来帮助我处理统计数据,但是我从一开始就遇到了问题,而且我在计算具有随机数且只有一维的数组的相对频率时遇到了很大的麻烦。

例如生成这些数字:

{3, 5, 5, 2, 4, 1, 3, 5, 4}

我希望程序告诉我 3 重复 2 次,4 3 次和 5 5 次

我已经创建了一个类来对这些值进行排序以计算中位数、第一和第三四分位数,但我仍然不知道如何找到频率以计算其他值

感谢您的宝贵时间

PS:不知道这是否会影响任何东西,但我正在使用 netbeans

【问题讨论】:

  • 所以你想让程序骗你?
  • 使用Map<Integer,Integer>
  • +1 @MrSmith42 我会支持
  • @RobinChander 如果数字范围比较小,我觉得我的解决方案不错。

标签: java frequency


【解决方案1】:

你肯定在找这个:Collections: frequency

如果您没有 Collection,请先将您的数组转换为列表:

Collections.frequency(Arrays.asList(yourArray), new Integer(3))

【讨论】:

  • 所以首先他需要找到所有不同的号码。然后只有他可以为每个人使用这个。我猜。
  • 没有。只需使用循环并遍历数组/列表中的元素,调用频率方法。
  • 那么同一个号码会多次调用频率。
  • 哦,你是对的。然后遍历new HashSet(Arrays.asList(yourArray))(同样,仅当您的数组还不是列表时才调用Arrays.asList
  • Lopez:是的,HashSet 会删除重复项。但在内部它会使用 for 循环来执行这些操作。我猜。而且频率 API 也可能具有 o(n) 复杂度。看看我的解决方案。
【解决方案2】:

如果您的数字范围相对较小,则最好使用计数器数组。 例如,如果您的随机数在区间 [1,5] 中,那么您可以使用大小为 5 的数组来存储和更新频率计数器:

int[] numbers = {3, 5, 5, 2, 4, 1, 3, 5, 4} ;
int[] frequencies = new int[5];

for(int n : numbers)
    frequencies[n-1]++;

输出数组 (frequencies):

1 1 2 2 3

编辑:

此方法可应用于所有范围。例如,假设您有[500,505] 范围内的数字:

int[] frequencies = new int[6];

for(int n : numbers)
    frequencies[n-500]++;

【讨论】:

  • 如果我有一个数组,比如 numbers = {1,2,10000,2,2,1,1000};这会浪费很多内存。
  • @PriyankDoshi 你不知道怎么看帖子吗?我说“如果范围很小......”那么这个解决方案很好。但似乎你需要在写评论之前学习如何阅读。
  • 哦,我的错。但是你不觉得它太静态了吗?
  • “静态”是什么意思?使用此解决方案,您可以通过 frequencies[n-1] 获得数字 n 的频率。是不是很酷?
  • @RobinChander 你在开玩笑吗?如果间隔为 [500,505],您将使用 frequencies[n-500]++; 填充数组并使用 frequency[n-500] 访问数字 n 的频率。理解这一点不是火箭科学。而且我的解决方案对小范围没有任何权衡。如果您有一个负间隔,例如[-5, -1],然后您可以使用 frequencies[n+5]++;. 填充数组
【解决方案3】:

编辑:您可以使用地图来存储频率,如下所示:

import java.util.HashMap;
import java.util.Map;

public class Frequency {
    public static void main(String[] args) {
        int[] nums = { 3, 5, 5, 2, 4, 1, 3, 5, 4 };
        int count = 1;
        // number,frequency type map.
        Map<Integer, Integer> frequencyMap = new HashMap<Integer, Integer>();
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != -1) {
                for (int j = i + 1; j < nums.length; j++) {
                    if (nums[j] != -1) {
                        if (nums[i] == nums[j]) {
                            // -1 is an indicator that this number is already counted.
                            // You should replace it such a number which is sure to be not coming in array.
                            nums[j] = -1;
                            count++;
                        }
                    }
                }
                frequencyMap.put(nums[i], count);
                count = 1;
            }
        }
        for (Map.Entry<Integer, Integer> entry : frequencyMap.entrySet()) {
            System.out.println(" Number :" + entry.getKey()
                    + " has frequence :" + entry.getValue());
        }
    }
}

带输出:

 Number :1 has frequence :1
 Number :2 has frequence :1
 Number :3 has frequence :2
 Number :4 has frequence :2
 Number :5 has frequence :3

【讨论】:

    【解决方案4】:
        int[] numbers = {100, 101, 102, 103, 5 , 4, 4 , 6} ;
    
        Map<Integer, Integer> m = new HashMap<Integer, Integer>();
        for(int num: numbers){
            if(m.containsKey(num)){
                m.put(num, m.get(num)+1);
            }else{
                m.put(num, 1);
            }   
        }
        for (Map.Entry<Integer, Integer> entry : m.entrySet()) {
            System.out.println("Key: " + entry.getKey() + " | Frequencey: " + entry.getValue());
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 2018-06-05
      • 2013-04-08
      • 1970-01-01
      • 2018-09-04
      相关资源
      最近更新 更多