【问题标题】:print either int or double with selfmade print method in java在java中使用自制打印方法打印int或double
【发布时间】:2014-04-29 15:50:16
【问题描述】:

我有一个程序可以创建整数和双精度的二维数组(有些是整数,有些是双精度)。我编写了一个方法来将这些数组作为映射打印到控制台。但是,我想知道是否可以同时接受 int 和 double 作为参数,而不是有两种方法用于 int 和 double。

这是我的打印功能:

private void printMap(int map[][]){
    for (int i=0; i<map.length;i++){
        for (int j=0; j<map[i].length;j++){
            if(map[i][j]<1000)System.out.print(" ");
            if(map[i][j]<100)System.out.print(" ");
            if(map[i][j]<10)System.out.print(" ");
            System.out.print(imap[i][j]+" ");
        }
        System.out.println("");
    }   
}

现在我有 2 倍相同的参数,除了参数,比如:

    private void print_intMap(int map[][]){..}
    private void print_doubleMap(double map[][]){..}

我希望它像

    private void printMap(/*either int or double*/){..}

有什么想法吗? 提前谢谢

【问题讨论】:

  • 假设您想坚持使用原语,我认为您无法避免这种情况。
  • 你不会在构建 java 类时有单独的私有类型的版本。例如 Arrays.binarySearch 有 char[], int[] double[] 等变种
  • 你想要发生什么双倍有多个小数位。例如" 0.0 1.123 "

标签: java parameter-passing


【解决方案1】:

您可以使用Number 类型作为您的数组类型。它由IntegerDouble 扩展。此类型可以通过Autoboxingdoubleint 原始类型创建,它们会自动为您执行此转换。

Number doubleNumber = 1.0;
Number intNumber = 1;

那么您的代码将如下所示:

private void printMap(Number map[][]) {
    for (int i = 0; i < map.length; i++) {
        for (int j = 0; j < map[i].length; j++) {
            if(map[i][j].intValue() < 1000) System.out.print(" ");
            if(map[i][j].intValue() < 100) System.out.print(" ");
            if(map[i][j].intValue() < 10) System.out.print(" ");
            System.out.print(imap[i][j].intValue() + " ");
        }
        System.out.println("");
    }   
}

【讨论】:

  • 顺便说一句 intdouble 不是 Number 你不能将 int[] 自动装箱到 Number[]
  • 是的,这是真的。我更新了我的答案以使这一点更清楚。
【解决方案2】:

我相信您最好的选择是使用多态性。本质上,您创建了两个具有相同名称的方法。唯一的区别是参数 - 一个将采用 int,另一个将采用 double。例如

private void printMap(int map[][])
private void printMap(double map[][])

这将允许您使用数组调用 printMap 而无需检查类型。

【讨论】:

    【解决方案3】:

    你想做的叫做“方法重载”:http://en.wikipedia.org/wiki/Method_overloading 这是一个适合您想要做的事情的好例子! :

    public class MainClass {
      // method printArray to print Integer array
      public static void printArray(Integer[] inputArray) {
        // display array elements
        for (Integer element : inputArray)
          System.out.printf("%s ", element);
        System.out.println();
      }
      // method printArray to print Double array
      public static void printArray(Double[] inputArray) {
        // display array elements
        for (Double element : inputArray)
          System.out.printf("%s ", element);
        System.out.println();
      }
    
      // method printArray to print Character array
      public static void printArray(Character[] inputArray) {
        // display array elements
        for (Character element : inputArray)
          System.out.printf("%s ", element);
    
        System.out.println();
      }
    
      public static void main(String args[]) {
        // create arrays of Integer, Double and Character
        Integer[] integerArray = { 1, 2, 3, 4, 5, 6 };
        Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 };
        Character[] characterArray = { 'H', 'E', 'L', 'L', 'O' };
    
        System.out.println("Array integerArray contains:");
        printArray(integerArray); // pass an Integer array
        System.out.println("\nArray doubleArray contains:");
        printArray(doubleArray); // pass a Double array
        System.out.println("\nArray characterArray contains:");
        printArray(characterArray); // pass a Character array
      }
    }
    

    取自本网站:http://www.java2s.com/Tutorial/Java/0100__Class-Definition/Usingoverloadedmethodstoprintarrayofdifferenttypes.htm

    【讨论】:

      【解决方案4】:

      这是不可能的。您可以做的几件事是:

      • 方法重载。您可以创建具有相同名称的方法,只要它们具有不同的参数。例如:

        private void printMap(int map[][]) {...}
        private void printMap(double map[][]) {...}
        

        然后您可以调用printMap 并使用int[][]double[][] 作为参数,它会执行相应的方法。

      • 让它接受Number[][]:

        private void printMap(Number map[][]) {...}
        

      【讨论】:

        【解决方案5】:

        您可以将方法作为参数保留为 double 并在使用 'int' 调用方法时进行强制转换

        printMap((double)map[][])
        

        【讨论】:

          【解决方案6】:

          我建议将 int 变量转换为 double 变量,然后在你的类中使用它(我相信这是最简单的解决方案):

          int x=7;
          double y=(double)x;  
          print_doubleMap(y);
          //or  
          print_doubleMap((double)x);
          

          【讨论】:

            【解决方案7】:

            你可以使用反射,但它很丑

            public static void print(int[][] ints) {
                printMatrix(ints);
            }
            
            public static void print(double[][]] doubles) {
                printMatrix(doubles);
            }
            
            public static void printMatrix(Object o) {
                int len1 = Array.getLength(o);
                for(int i = 0; i < len1; i++) {
                     Object o2 = Array.get(o, i);
                     int len2 = Array.getLength(o2);
                     for(int j = 0; j < len2; j++) 
                         System.out.printf("%4s ", Array.get(o2, j);
                     System.out.println();
                }
            }
            

            我不知道这是否比仅仅复制一个方法更干净。

            public static void print(int[][] ints) {
                for(int[] is : ints) {
                    for(int i : is)
                        System.out.printf("%4d ", i);
                    System.out.println(i);
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-04-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-06-19
              • 1970-01-01
              • 2014-05-11
              • 1970-01-01
              相关资源
              最近更新 更多