不使用ArrayList声明一个未知大小的数组

4

有没有一种方法可以声明一个长度未知的数组?我的问题是从一定范围内的数字返回奇整数的int []。我的当前输出是添加0以填充数组的剩余空间。

public class Practice {

   static int[] oddNumbers(int minimum, int maximum) {

     int[] arr = new int[10];
     int x = 0;
     int count = 0;

     for(int i = minimum; i <= maximum; i++){
        if(i % 2 != 0){
           arr[x] = i;
           ++x;    
        }
     }
     return arr;
   }

   public static void main(String[] args) {
     int min = 3, max = 9;
     System.out.println(Arrays.toString(oddNumbers(min, max)));
   } 
}

我的当前输出为 [3,5,7,9,0,0,0,0,0,0] ,但我想要的是 3,5,7,9 。它必须是一个数组而不是 ArrayList 。这可能吗?还是有完全不同的方法?


1
你不能声明一个没有大小的数组。你需要返回int[],然后只需使用ArrayList并返回arrayList.toArray() - TuyenNTA
你为什么不能使用 ArrayList - Cardinal System
1
这绝对是ArrayList的确切用例。你有什么反对ArrayList的? - Neatname
2
通过一些数学计算,您可以准确地计算出数组中将有多少个元素。它将是 (maximum - minimum) / 2,然后在 minimummaximum 都是奇数或偶数的情况下加上 +/- 1 - 4castle
这个问题的主要问题在于,根据你的用例来看,它并不是一个“未知大小”的问题。 - Felix Guo
4个回答

4

在您的使用情况中,您知道需要多少个数字。根据最小值和最大值查找如何找到两个数字之间奇数数量的方法。然后只需分配那么多:

int closestMin = minimum % 2 == 0 ? minimum + 1 : minimum;
int closestMax = maximum % 2 == 0 ? maximum - 1 : maximum;
int numberOfOdds = ((closestMax - closestMin) / 2) + 1;
int[] arr = new int[numberOfOdds];
....

3
您可以先确定将有多少元素存储在数组中,然后构建相应大小的数组:
import java.util.Arrays;

public class Practice {

   static int[] oddNumbers(int minimum, int maximum) {

     int x = 0;

     for(int i = minimum; i <= maximum; i++){   //
        if(i % 2 != 0){                         ////
           ++x;                                 ////// Find the element count
        }                                       ////
     }                                          //

     int[] arr = new int[x]; // Construct array with the length of the element count
     x = 0; // Reset X (Just to avoid creating a new control variable)    

     for(int i = minimum; i <= maximum; i++){
         if(i % 2 != 0){
             arr[x] = i;
             ++x;
         }
      }

     return arr;
   }

   public static void main(String[] args) {
     int min = 3, max = 9;
     System.out.println(Arrays.toString(oddNumbers(min, max)));
   } 
}

非常感谢!不介意我问一下,为什么在创建数组后需要将x重置为0? - dollaza
1
@smrak 如果 x == 4,那么执行 int[] arr = new int[x]; 将创建一个长度为3的数组,但是在此操作之后,x仍然等于4,因此当第二个 for 尝试执行 arr[x] = i; 时,它将抛出一个 java.lang.ArrayIndexOutOfBoundsException,因为索引从0开始。这有点难以解释,但如果您尝试在没有 x = 0 语句的情况下运行该程序,我认为您会理解。 - Cardinal System

2

在返回时,您应该将元素添加到 ArrayList 中并将其转换为数组,例如:

static int[] oddNumbers(int minimum, int maximum) {

    List<Integer> arr = new ArrayList<>();

    for (int i = minimum; i <= maximum; i++) {
        if (i % 2 != 0) {
            arr.add(i);
        }
    }
    return arr.stream().mapToInt(Integer::intValue).toArray();
}

2
你也可以使用 IntStream.Builder - 4castle

0

Java 不允许使用可变大小的数组。

您可以创建一个 ArrayList,将值存储为其中的 Integer 对象,然后返回一个 Integer[] 数组。例如,如果 ArrayList 对象名为 list,则返回值将为

list.toArray(new Integer[list.size()]);

如果您想返回一个原始整数数组int[],那么您必须将Integer对象转换为整数值并手动创建数组。 Java 8提供了一种方便的符号表示法,使用流,如另一个答案中所述。

这种类型的转换问题已经在StackOverflow上广泛讨论,例如:


你不能在不迭代的情况下将List<Integer>转换为int[] - Darshan Mehta
当然,这就是我回答中提到“手动”转换的原因。 :-) - PNS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接