[英]declare an array with unknown size without using ArrayList
有没有办法声明一个长度未知的数组? 我的问题是从一系列数字返回奇数的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 。 这可能吗? 还是有完全不同的方法?
那么,在您的用例中,您确切地知道您需要多少个数字。 查找如何根据您的最小值和最大值查找两个数字之间的奇数个数。 然后只分配那么多:
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];
....
您可以找出将在阵列中存储多少元素,然后将数组构造为该大小:
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)));
}
}
您应该在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();
}
Java
不允许可变大小的数组。
您可以创建一个ArrayList
,将值存储为Integer
对象,然后返回一个Integer[]
数组。 例如,如果ArrayList
对象被称为list
,那么返回值将是
list.toArray(new Integer[list.size()]);
如果要返回原始整数int[]
的数组,则必须将Integer
对象转换为整数值并手动创建数组。 Java 8
使用流提供了一个方便的表示法,如另一个答案中所述。
StackOverflow
已经广泛讨论了这种类型的转换问题,例如:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.