【问题标题】:Java Multidimensional array and integer occurrencesJava多维数组和整数出现
【发布时间】:2015-09-01 13:39:56
【问题描述】:

我有一个名为 numList 的整数数组,它有

[4, 4, 3, 3, 3, 2, 1, 1, 1, 1, -1, -12, -12, -12, -12]

我想创建一个可以存储的多维数组

左边代表次数,右边决定出现次数。

我尝试过的尝试......我没有成功。

        // Declaring the new multi-dimensional array.
    int [] [] newArray = new int [6] [2];

    // Counter 3.
    int counter3 = 0;

    // Get first occurrence.    
    while (numList[counter3] < numList.length){



        for (int counter3:numList){
            newArray[] ([counter3]++);


        }

【问题讨论】:

  • 好的,你有什么尝试吗?
  • 伟大的故事兄弟。你的问题在哪里?
  • 请发表您最近一次失败的独立解决此问题的尝试。
  • 已更新...我设法对其进行了排序,然后我被卡住了。 :(

标签: java arrays multidimensional-array


【解决方案1】:

假设您的号码按照您的示例numList 中的顺序排列,那么您可以这样做:

int[] numList = { 4, 4, 3, 3, 3, 2, 1, 1, 1, 1, -1, -12, -12, -12, -12 };
int[][] newArray = new int[6][2];
int index = 0;

for (int i = 0; i < numList.length;) {
    int count = 0;
    for (int x = 0; x < numList.length; x++)
        if (numList[x] == numList[i]) count++;
    newArray[index][0] = numList[i];
    newArray[index][1] = count;
    index++;
    i += count;
}
for (int x = 0; x < newArray.length; x++) {
    for (int i = 0; i < newArray[0].length; i++)
        System.out.print(newArray[x][i] + " ");
    System.out.println();
}

这样,您不必像其他答案那样处理导入(而且这更短),但这仅在您订购了数字时才有效。不过,有一些很好的排序算法。

编辑:我对其进行了更改,以便它可以采用任何大小的任何顺序的数字。

int[] numList = { 6, 6, 5, 5, 4, 4, 3, 2, 1, 1, 1, 7, 6, 5, 7, 8, 65, 65, 7 };
int[][] newArray = new int[1][2];
int index = 0;
for (int i = 0; i < numList.length;) {
    try {
        int count = 0;
        boolean isUnique = true;
        for (int x = 0; x < i; x++)
            if (numList[x] == numList[i]) {
                isUnique = false;
                break;
            }
        if (isUnique) {
            for (int x = 0; x < numList.length; x++)
                if (numList[x] == numList[i]) count++;
            newArray[index][0] = numList[i];
            newArray[index][1] = count;
            index++;
        }
        i++;
    } catch (ArrayIndexOutOfBoundsException e) {
        int tmpArray[][] = newArray;
        newArray = new int[tmpArray.length + 1][tmpArray[0].length];
        for (int row = 0; row < tmpArray.length; row++)
            for (int col = 0; col < 2; col++)
                newArray[row][col] = tmpArray[row][col];
    }
}
for (int x = 0; x < newArray.length; x++) {
    for (int i = 0; i < newArray[0].length; i++)
        System.out.print(newArray[x][i] + " ");
    System.out.println();
}

因此,在这一点上,使用其他答案中的地图可能会更短。我的第二个答案的唯一好处是不用担心进口。

【讨论】:

  • 我做了一个 System.out.println(Arrays.toString(newArray)); [[I@63ce0e18, [I@6cff7cd8, [I@795d80cf, [I@69b3d448, [I@1d35f92f, [I@427a8ba4] 已返回。
  • 那是因为那是newArray中每个数组的标识符。我更新了代码以正确显示它。
  • 感谢它现在起作用了。惊人的!我试图分析并从中学习一些东西。
【解决方案2】:
    private Map<Integer, Integer> segregateArray(List<Integer> list) {
    Map<Integer, Integer> result = new HashMap<>();
    for (Integer i : list) {
        if (result.containsKey(i)) {
            result.put(i, result.get(i) + 1);
        } else {
            result.put(i, 1);
        }
    }
    return result;
}

这应该可行。如果您仍然需要返回数组,请使用:

private int[][] segregateArray(int[]list) {
    Map<Integer, Integer> resultHelper = new HashMap<>();
    for (int i : list) {
        if (resultHelper.containsKey(i)) {
            resultHelper.put(i, resultHelper.get(i) + 1);
        } else {
            resultHelper.put(i, 1);
        }
    }
    int[][] result = new int[resultHelper.size()][2];
    int arrayIterator=0;
    for(Integer key : resultHelper.keySet())
    {
        result[arrayIterator][0]=key;
        result[arrayIterator][1]=resultHelper.get(key);
        arrayIterator++;
    }
    return result;
}

【讨论】:

  • 我需要导入什么吗?
  • 导入 java.util.HashMap;导入 java.util.Map;
  • 感谢您的努力。自从你发布以来,我一直在努力。作为一个新手,这是我应该用来调用你的方法的吗?我确实更改了 (int[] numList) 和 for (int i: numList)
  • 在 main 方法(或任何你想使用它的地方)只需调用这个方法 int[] array = {4, 4, 3, 3, 3, 2, 1, 1, 1, 1, -1,-12,-12,-12,-12}; int [] [] newArray = segregateArray(array);
【解决方案3】:

在现实生活中的项目中,您可能应该避免自己使用低级数组机制实现这样的功能(您添加了一个扩展的测试套件,不是吗?:) 并选择一个可用的库。

在 Java 8 中,这可以很好地使用闭包来完成,类似于此处描述的内容:Count int occurrences with Java8

在 Java 7 和更早版本中,我会使用其中一个集合库,例如 Guava,其中包含一个 Multiset 集合,可提供您所需要的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2018-10-17
    • 1970-01-01
    相关资源
    最近更新 更多