1

嗨,我想显示 int[] 数组中出现的数字。我发现很多人试图问类似的问题,但他们的数组是字符串。这是我的工作从 10-25 中选择 10 个随机数并打印 100 次,显示数字的出现。例如:

12 15 16 17 20 14 24 21 22 15 10 12 16 24 23 14 23 12 11 10

10 的频率是:2 11 的频率是:1 12 的频率是:3 依此类推

public void pickRandomNo(int[] a) {
        printHeader();
        Random randomGenerator = new Random();
        for (int row = 0; row < 9; row++) {
            for (int i = 0; i < 10; i++) {
            array[i] = 10 + randomGenerator.nextInt((25 - 10) + 1);
            System.out.print(array[i] + " ");
        } System.out.println("");
      }      
    }

 public void displayOccurences() {
        ArrayList arrlist = new ArrayList();       
        arrlist.add(array);
        int freq = Collections.frequency(arrlist, 10);
        System.out.println("Frequency of 10 is: " + freq);      
    }
4

3 回答 3

3

好吧,对于您的displayOccurences方法,您可以这样做:

int freq = Collections.frequency(Arrays.asList(array), 10);

或者你可以用老式的方式做它并迭代:

int freq = 0;
for(final int v : array)
    if(v == 10)
        freq++;

或者,如果您使用的是 Java 8,则可以尝试以下操作:

int freq = Arrays.asList(array).stream().filter(i -> i.equals(10) || i == 10).count();
于 2013-08-29T03:20:38.743 回答
0

基于 Guava MultiSet 的解决方案:

    HashMultiset<Integer> ms = HashMultiset.create();
    for(int i : a) {
        ms.add(i);
    }
    for(Entry<Integer> e : ms.entrySet()) {
        System.out.println(e.getElement() + " - " + e.getCount());
    }
于 2013-08-29T03:59:11.850 回答
0

您要确保计算数组的整个范围。我有一个类似的问题,我在一个非常大的 ArrayList 中显示每个温度的所有出现我使用这个静态方法来显示一个表格。

public static void displayOccurances(ArrayList<Integer> tempsList){
    //  get min and max for looping
    int i = Collections.min(tempsList);
    int maxTemp = Collections.max(tempsList);

    // Table Headings
    System.out.println("Frequency of each teperature");
    System.out.printf("%4s%9s%n", "TEMP", "COUNT");
    System.out.printf("%4s%9s%n", "====", "=====");

    // Loop through arraylist to display occurrences
    while (i <= maxTemp) {
        System.out.printf("%4s%9s%n", i, Collections.frequency(tempsList, i));
        i++;
    }
}

我将在这里为您将其重构为通用数组。

public static void displayOccurances(Integer[] array){
    //  get min and max for looping
    int i = Collections.min(array);
    int maxInt = Collections.max(array);

    // Table Headings
    System.out.println("Frequency of each Integer");
    System.out.printf("%3s%9s%n", "INT", "COUNT");
    System.out.printf("%3s%9s%n", "===", "=====");

    // Loop through array to display occurrences
    while (i <= maxInt) {
        System.out.printf("%3s%9s%n", i, Collections.frequency(array, i));
        i++;
    }
}

这是我的第一个答案,如果我的代码显示不正确,请见谅。

这个想法是您使用 Java 集合类(您需要导入它)来识别您的最高和最低出现次数。从低范围开始,您再次使用集合类检查范围内的每个整数的出现次数。

如果您不想显示 0 次出现,只需在循环内的 printf 周围放置一个 if ,就像这样

// Loop through arraylist to display occurances
    while (i <= maxTemp) {
        if (Collections.frequency(tempsList, i) > 0){
            System.out.printf("%4s%9s%n", i, Collections.frequency(tempsList, i));                
        }
        i++;
    }
于 2016-02-21T20:47:45.217 回答