首页 > 解决方案 > 方法重载技术

问题描述

我有一个方法重载,如下所示:

public class Odddetector {

    public static void main(String[] args) {
        int count = countOdd(new int [] {5, 7, 3, 9, 0});
        System.out.println(count);
        count = countOdd(new int [] {2, 6, 4, 8, 1});
        System.out.println(count);
        count = countOdd(5, 7, 10);
        System.out.println(count);
        count = countOdd(8, 2, 7);
        System.out.println(count);
        count = countOdd(new int[][] {{1, 2}, {3, 4, 5}});//extra point only
        System.out.println(count);
        count = countOdd(new int[][] {{6, 2}, {3, 4, 0}});//extra point only
        System.out.println(count);
    }
public static int countOdd(int[] a){
      int count=0;
      for (int i: a) count = (i %2 != 0)?++count:count;
      return count;
      // Do Something;
}
public static int countOdd(int[][] a){
     // Do Something;
     int count=0;
     for (int b = 0; b< a.length; b++){
            //System.out.println(java.util.Arrays.toString(a[b])); not a necessary line.
            count += countOdd(a[b]);
        }
      return count;
}
// more method overloading

我的问题是有一种方法可以将解决方案浓缩为一种考虑 N 维数组的方法。代码像这样运行良好,但是我想知道哪些 Java 技术可以帮助解决维度的增加。我想补充一些细节,那就是第一个方法是基本方法,所有其他方法都调用第一个 int[] a。我添加的新部分是我目前正在开发此代码的完整代码,这是我的教授提出的挑战。我目前有 Lang 的数据结构,我可以接受提示。实际上,我更喜欢提示,因为我想学习编写代码。

标签: javaarraysmultidimensional-array

解决方案


当参数是多维数组时,您可以递归调用向下挖掘的函数,直到最终得到一维数字数组。逻辑是:

if a is a multi-dimensional array
    for each array in a
        call recursively
else
    count odd numbers in a

我有 2 个功能。一个接受可变数量的参数和一个递归的。第一个只是用 var args 作为数组调用第二个。如果您想允许混合参数,则 varargs 函数需要一些工作(例如countOdd(new int [] {1,2,3}, 4, 5);:)

// The var args version. You call this. It then calls the recursive
// version.
public static <T> int countOdd(T... arguments)
{
   return countOddRec(arguments);
}

// Recursive version
private static <T> int countOddRec(T[] a)
{
    if (a == null || a.length == 0) return 0;
    
    int count=0;

    // Is it an array of Numbers?
    if (a[0] instanceof Number) {
        for (T i: a) {
            // Simplified the counting code a bit. Any # mod 2 is either 0 or 1
            count += ((Number)i).intValue() % 2;
        }
    }
    // Is it an multi-dimensional? Call recursively for each sub-array.
    else {
        for (T sub : a) {
            count += countOddRec((T[])sub);
        }
    }
    
    return count;
}

如评论中所述,这不适用于原始数据类型(例如:int等)。相反,请使用非原始类型(例如:Integer等)。


推荐阅读