如何获得给定数组的频率?

时间:2018-04-25 18:14:16

标签: java

我需要通过用“*”替换它来找出这些数字出现在数组中的次数,但它会给出这么多的星星。 有没有人有建议帮我解决这个问题。 这就是我所拥有的

public class Frequency {
    public static void main(String[] args) {
        int[] rateFrequency = { 0, 1, 2, 2, 2, 3, 3 };

        for (int i = 0; i <= 4; i++) {
            System.out.println(i + ":");

            for (int j = 0; j <= rateFrequency.length; j++) {
                System.out.print(" * ");
            }

        }
    }
}

4 个答案:

答案 0 :(得分:1)

也许你可以使用Collections.frequency()方法:

Integer[] rateFrequency = { 0, 1, 2, 2, 2, 3, 3 }; 
List<Integer> list = Arrays.asList(rateFrequency);

for(int i=0; i<=4; i++){
    System.out.println(i+":" + Collections.frequency(list,i));
}

输出:

0:1
1:1
2:3
3:2
4:0

您可以通过创建另一个循环来修改它以打印“*”。

答案 1 :(得分:0)

我建议对于每个数字(0-3),每次一个项目与当前数字相同时,迭代数组并打印一个星号。

您可以通过首先遍历数组来查找数字范围的范围,从而使其更好。

一种可能的替代方法是将数字添加到Multiset(例如来自Google的Guava图书馆),这可以自动告诉您任何项目的计数。

我在下面提供了一些示例代码。显然,在您尝试自己编写代码之前,请不要查看此代码!

public static void main(String[] args) {
    int[] rateFrequency = { 0, 1, 2, 2, 2, 3, 3 };

    int maxNum = 0;
    for (int i = 0; i < rateFrequency.length; i++) {
        maxNum = Math.max(maxNum, rateFrequency[i]);
    }

    for (int num = 0; num <= maxNum; num++) {
        System.out.print(num + ": ");

        for (int i = 0; i < rateFrequency.length; i++) {
            if (rateFrequency[i] == num) {
                System.out.print(" * ");
            }
        }
        System.out.println();
    }
}

产地:

  

0:*
  1:*
  2:* * *
  3:* *

如果您想避免Math.max(),您可以自己编写等效代码:

int maxNum = 0;
for (int i = 0; i < rateFrequency.length; i++) {
    int num = rateFrequency[i];
    if (num > maxNum) {
        maxNum = num;
    }
}

答案 2 :(得分:0)

您可以使用哈希轻松解决此问题。您可以在数组中保留每个数字的计数,然后打印“*”,与数组中存在的次数一样多。

  

数组的基数,作为数字频率的每个基数中的数字和值。

public class Frequency {
    public static void main(String[] args) {
        int[] rateFrequency = { 0, 1, 2, 2, 2, 3, 3 }; 
        int[] keepCount = new int[rateFrequency.length]; //to keep frequency of each number

        for(int i=0; i<rateFrequency.length; i++) 
            keepCount[rateFrequency[i]]++; //counting the frequency of each number

        for(int i=0; i<rateFrequency.length; i++) {
            if(keepCount[i] > 0)
                System.out.print(i + ": ");

            while(keepCount[i] > 0) {
                System.out.print("*"); //printing frequency in terms of *
                keepCount[i]--; //decreasing the count 
            }
            System.out.println();
        }
    }
}

输出

  

0:*

     

1:*

     

2:***

     

3:**

答案 3 :(得分:0)

选项1:

假设输入数组总是被排序,并且不需要打印零星的值,可以使用这种类型的循环:

int[] arr = { 0, 1, 2, 2, 2, 3, 3 };
int pos = 0;
while(pos < arr.length) {
    int current = arr[pos];
    System.out.print(current + ":");
    do {
        System.out.print(" *");
        ++pos;
    } while(pos < arr.length && arr[pos] == current);
    System.out.println();
}

<强>输出:

  

0:*

     

1:*

     

2:* * *

     

3:* *

选项2:

但是,如果您需要打印给定范围的所有值(例如0-4),即使它们的零星也是如此,那么我会使用类似的东西(再次,这段代码假定一个有序输入阵列):

final int RANGE = 4;
int[] arr = { 0, 1, 2, 2, 2, 3, 3 };
int pos = 0;
for(int n=0; n <= RANGE; ++n) {
    System.out.print(n + ":");
    while(pos < arr.length && arr[pos] == n) {
        System.out.print(" *");
        ++pos;
    }
    System.out.println();
}

<强>输出:

  

0:*

     

1:*

     

2:* * *

     

3:* *

     

4: