java - 方法重载技术
问题描述
我有一个方法重载,如下所示:
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 的数据结构,我可以接受提示。实际上,我更喜欢提示,因为我想学习编写代码。
解决方案
当参数是多维数组时,您可以递归调用向下挖掘的函数,直到最终得到一维数字数组。逻辑是:
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
等)。
推荐阅读
- vb.net - 更好的性能 Linq To SQL 查询
- android - 我的 sql 删除命令使我的 db.insert 导致崩溃
- python - 如果在单元测试中跳过python中的代码
- laravel - 在中间件之间传递数据
- javascript - 从 Google Doc 到 Google Spreadsheet 复选框的交互式更改
- java - 在 Spring 安全中并发会话的情况下使第一个登录会话无效
- ios - glReadPixels 使用多重采样返回 null
- c# - 将数据(DataTable)从 powershell 管道传输到 Commandlet C#
- javascript - JS Web 视图上的 Twitter API - 创建一个代表用户发推文的 Twitter 客户端
- javascript - RegExp 替换所有字母,但不是第一个和最后一个