【问题标题】:Use Array Initializers in a Function in Java在 Java 中的函数中使用数组初始值设定项
【发布时间】:2021-11-05 10:10:33
【问题描述】:

我想编写一个函数,根据我选择的输入,给我一个不同的 int 数组 testArray 作为输出。在这个例子中,我想选择number = 0,结果得到testArray = {1,2,3,4,5}。当我给 testArray 值时,我得到这个错误:

Array constants can only be used in initializers

public class ArrayExample{  
    
    public static void main(String args[]){
        int number = 0;
        int[] newArray = new int[5];
        newArray = getValues(number);
    }
    

    public static int[] getValues(int number) {
        
        int[] testArray = new int[5];
            
            if(number == 0) {
                testArray  = {1,2,3,4,5}; 
            }
            else if(number == 1) {
                testArray  = {2,3,4,5,6}; 
            }
            else if(number == 2) {
                testArray  = {3,4,5,6,7}; 
            }
            else if(number == 3) {
                testArray  = {4,5,6,7,8}; 
            }       
            else{
                testArray  = {5,6,7,8,9}; 
            }   

            
        return testArray;
    }

    
}

【问题讨论】:

    标签: java arrays static-methods


    【解决方案1】:

    如错误Array constants can only be used in initializers中所述。

    有效代码

    int[] arr = {1,2,3,4,5};
    

    代码错误

    int[] arr;
    arr = {1, 2, 3, 4, 5};
    

    添加new int[]关键字使代码可编译

    testArray = new int[] {1, 2, 3, 4, 5};
    

    但最好使用循环以这种方式初始化数组

    public static int[] getValues(int number) {
        int[] testArray = new int[5];
    
        for(int i = 0; i < testArray.length; i++) {
            testArray[i] = number + i + 1;
        }
    
        return testArray;
    }
    

    或流

    public static int[] getValues(int number) {
        return IntStream.range(number + 1, number + 6).toArray();
    }
    

    【讨论】:

      【解决方案2】:

      数组声明的语法仅在声明新数组时有效。您可以使用括号中的值分配给现有数组变量,但您必须添加新的和类型:

      testArray = new int[]{1,2,3,4,5};
      

      似乎应该推断类型,但此功能早于类型推断。

      在这里你可以做一次声明,然后根据传入的数字分配一个子范围:

      static int[] getValues(int number) {
          if (number > 4 || number < 0) number = 4;
          int[] testArray = {1,2,3,4,5,6,7,8,9};
          return Arrays.copyOfRange(testArray, number, number + 5);
      }
      

      【讨论】:

      • 虽然这是重写用户预期代码的一种优雅方式,但它并不能解释与问题中提出的问题相关的任何内容。
      • @Davide:是的,我添加了一些解释。
      【解决方案3】:

      我们不能使用以下语法为数组赋值。

      int[] newArray = new int[5];
      testArray  = {1,2,3,4,5}; 
      
      

      要解决你可以使用的问题

        testArray  = new int[] {1,2,3,4,5}; 
      

      【讨论】:

        【解决方案4】:

        您只能在初始化程序中使用语法{1, 2, 3, 4, 5}(初始化程序是用于定义新变量并为其分配值的代码)。如果您不使用初始化程序,则需要使用语法 new int[]{1, 2, 3, 4, 5}

        您可以按如下方式重构您的代码:

        public static int[] getValues(int number) {
           switch (number) {
               case 0: return new int[]{1,2,3,4,5}; 
               case 1: return new int[]{2,3,4,5,6}; 
               case 2: return new int[]{3,4,5,6,7}; 
               case 3: return new int[]{4,5,6,7,8}; 
               default: return new int[]{5,6,7,8,9}; 
           }
        }
        

        请注意,对于这种情况,我还使用了一个更具可读性的开关。但是如果你更喜欢的话,你仍然可以使用 if else if else。

        你也可以按照代码改变main的方法

         int[] newArray = new int[5];
         newArray = getValues(number);
        

         int[] newArray = getValues(number);
        

        实际上你不需要创建一个你不使用的空数组(new int[5]),你可以直接分配getValues方法返回的数组。

        【讨论】:

          【解决方案5】:

          使用Arrays.setAll 试试这个

          for (int i = 0; i < 5; i++) {
              int [] result = getValues(i);
              System.out.println(Arrays.toString(result));
          }
          

          打印

          [1, 2, 3, 4, 5]
          [2, 3, 4, 5, 6]
          [3, 4, 5, 6, 7]
          [4, 5, 6, 7, 8]
          [5, 6, 7, 8, 9]
          

          方法

          public static int[] getValues(int number) {
              int[] array = new int[5];
              Arrays.setAll(array, i->number+i+1);
              return array;
          }
          

          您也可以将数组的大小作为参数传递。

          【讨论】:

            猜你喜欢
            • 2012-07-22
            • 2016-05-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-05-15
            • 2011-09-30
            相关资源
            最近更新 更多