我想比较两个数组,并匹配从1到另一个的最高出现次数?

时间:2014-07-31 00:59:52

标签: java

我想比较两个包含数字的数组, array2 中出现次数最多的数字(前10名)与 array1 中的数字。示例 array1 { 123 ,132,231,213,312,321,456,765,987}表示 array2 <中 123 / strong> = 6次。这意味着 123 array1 中出现了6次。其范围为000 - 999. array2 中的每个数字都匹配可能在 array1 中找到的6个数字。示例 123 = 123,132,231,213,312,321。不计算重复示例 111 177 的数字。 Array2 有一组固定的数字,而 array1 会更新。我必须使用哪种数据类型?我如何计算重新排列的数字?

这是我到目前为止所得到的;

import java.util.Arrays;

public class tuna {

public static void main(String[] args) {
    int array1[] = { 123, 132, 231, 213, 312, 321};
    int array2[] = { 012, 013, 014, 015, 016, 017, 018, 019, 123, 124, 125, 126, 127};                       
    count(array1);
  }

    private static void count(int[] arr) {

    Arrays.sort(arr);

    int sum = 0, counter = 0;

    for (int i = 0; i < arr.length; i++) {
        if (arr[0] == arr[arr.length - 1]) {
        System.out.println(arr[0] + ": " + counter + " times");
        break;
    } else {
        if (i == (arr.length - 1)) {
            sum += arr[arr.length - 1];
            counter++;
            System.out.println((sum / counter) + " : " + counter
                    + " times");
            break;
        } else {
            if (arr[i] == arr[i + 1]) {
                sum += arr[i];
                counter++;
            } else if (arr[i] != arr[i + 1]) {
                sum += arr[i];
                counter++;
                System.out.println((sum / counter) + " : " + counter
                        + " times");
                sum = 0;
                counter = 0;
               }
            }
         }
      }
    } 
 }

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么你想要计算array1中数字2中数字排列(000-999)的频率。您可以通过将array2中数字的所有排列映射到&#34;置换组&#34;,为每个这样的组分配计数器,并迭代通过array1查找组和增加计数器来完成此操作。此代码可以执行您想要的操作:

public static void main(String[] args) {
    int array1[] = { 123, 132, 231, 213, 312, 321 };
    int array2[] = {  12,  13,  14,  15,  16,  17,  18,  19, 123, 124, 125, 126, 127 };
    count(array1, array2);
}

private static void count(int[] arr1, int[] arr2) {

    // prepare a mapping of permutations of numbers in arr2 to arr2 indexes 
    int[] permutationGroupOfNumber = new int[1000];
    Arrays.fill(permutationGroupOfNumber, -1);
    for (int i = 0; i < arr2.length; i++) {
        int number = Math.abs(arr2[i]) % 1000; // just to be safe
        int digit1 = number % 10;
        int digit2 = (number / 10) % 10;
        int digit3 = (number / 100) % 10;
        permutationGroupOfNumber[digit1 + digit2 * 10 + digit3 * 100] = i;
        permutationGroupOfNumber[digit1 + digit3 * 10 + digit2 * 100] = i;
        permutationGroupOfNumber[digit2 + digit1 * 10 + digit3 * 100] = i;
        permutationGroupOfNumber[digit2 + digit3 * 10 + digit1 * 100] = i;
        permutationGroupOfNumber[digit3 + digit1 * 10 + digit2 * 100] = i;
        permutationGroupOfNumber[digit3 + digit2 * 10 + digit1 * 100] = i;
    }

    // count the number of occurrences of permutations in arr1
    int[] occurrencesOfPermutationsInGroup = new int[arr2.length];
    for (int i = 0; i < arr1.length; i++) {
        int g = permutationGroupOfNumber[arr1[i]];
        if (g >= 0)
            occurrencesOfPermutationsInGroup[g]++;
    }

    // output number of occurrences
    for (int i = 0; i < arr2.length; i++) {
        int g = permutationGroupOfNumber[arr2[i]];
        if (occurrencesOfPermutationsInGroup[g] > 0)
            System.out.println(arr2[i] + ": " + occurrencesOfPermutationsInGroup[g] + " time(s)");
    }
}