Java返回数组越界异常
我有一些代码将数组中的整数与给定值进行比较,并创建一个新数组,其值仅高于给定值。这是我的代码:Java返回数组越界异常,java,arrays,Java,Arrays,我有一些代码将数组中的整数与给定值进行比较,并创建一个新数组,其值仅高于给定值。这是我的代码: import java.util.Arrays; class ex6{ public static void main(String[] args){ int[] a = {12, 13, 14}; filter(a, 15); } public static int[] filter(int[] a, int b){ int[] newArray = {}; fo
import java.util.Arrays;
class ex6{
public static void main(String[] args){
int[] a = {12, 13, 14};
filter(a, 15);
}
public static int[] filter(int[] a, int b){
int[] newArray = {};
for(int i = 0; i < a.length; i++){
if(a[i] < b){
newArray[i] = a[i];
}
}
System.out.println(Arrays.toString(newArray));
return newArray;
}
}
导入java.util.array;
ex6类{
公共静态void main(字符串[]args){
int[]a={12,13,14};
过滤器(a,15);
}
公共静态int[]筛选器(int[]a,int[]b){
int[]newArray={};
for(int i=0;i
然而,当我试图运行代码时,它返回一个数组越界异常,我不知道为什么。循环只在数组的长度上运行,因此不应该发生这种情况
newArray
的长度为0
,因此只要a
非空,newArray[i]
将导致您看到的异常
也许你真正想要的是:
public static int[] filter(int[] a, int b){
return Arrays.stream(a)
.filter(elem -> elem < b)
.toArray();
}
公共静态int[]过滤器(int[]a,int[]b){
返回数组.stream(a)
.过滤器(元素->元素
这与user3437460的回答不同,它的结果是一个仅包含符合条件的元素的数组,而user3437460的结果是一个与原始数组大小相同的数组,但所有低于阈值的元素都被替换为
0
。哪一个是正确的取决于您没有指出的要求。这是因为您的新阵列是空的
int[] newArray = {};
尝试将其设置为数组a
的大小:
int[] newArray = new int[a.length];
您正在创建一个
newArray
,其中正好有0个元素,然后尝试将其中的元素设置在分配的元素槽之外
为了分配正确的数量,您必须预先知道数组大小。按照您构建代码的方式,您可以使用newArray=newint[a.length]
来实现这一点。在本例中,这是可行的,因为如果筛选条件匹配,则在与原始数组中完全相同的索引处分配值newArray[i]=a[i]
。跳过的值将保持值“0”,这可能是您想要的,也可能是您不想要的
这可能是您想要的,但通常程序员在程序中不使用数组,而是使用集合库中的不同类,例如列表和集合。在现代编程中,不太可能有整数数组
由于Java8,这类问题最好通过流来解决,在需要的元素中进行过滤,然后将它们收集到一个列表中,或者可能收集到一个数组中。对于基本整数,可能是一个集合:
public static int[] filter(int[] a, int b) {
return Arrays.stream(a) // creates an IntStream
.filter(v -> v < b) // filter in the elements where the v < b
.toArray(); // collect them into an array
}
公共静态int[]过滤器(int[]a,int[]b){
return array.stream(a)//创建一个IntStream
.filter(v->v
我想重复我的警告,如果你需要这种类型的代码,你可能是设计错误的方式。很可能
如果您真的、真的、真的希望通过数组执行此操作,并且希望返回缩小的数组,则需要分配一个具有所需最大大小(a.length)的数组,并在
newArray
中保留插入位置的索引,最后创建另一个包含过滤项数量的数组,然后使用将这些元素复制到数组中。您正在将新数组
初始化为空数组:
int[] newArray = {};
然后,当数组没有元素时,尝试为索引i处的元素赋值:
newArray[i] = a[i];
您应该使用适当的大小初始化数组,以便能够为其元素分配/读取值。默认情况下,这可能是参数a
数组长度,但可以根据需要进行优化:
class ex6 {
public static void main(String[] args){
int[] a = {12, 13, 14};
filter(a, 15);
}
public static int[] filter(int[] a, int b){
int[] newArray = new int[a.length];
for(int i = 0; i < a.length; i++){
if(a[i] < b){
newArray[i] = a[i];
}
}
System.out.println(Arrays.toString(newArray));
return newArray;
}
}
类ex6{
公共静态void main(字符串[]args){
int[]a={12,13,14};
过滤器(a,15);
}
公共静态int[]筛选器(int[]a,int[]b){
int[]newArray=newint[a.length];
for(int i=0;i
首先,您说过新数组必须包含大于给定值且不小于给定值的值,但您的做法正好相反
而不是
if(a[i] < b)
另外,如果您在这里使用ArrayList,它可以帮助您减少所占用的空间,因为在创建阵列时,您必须初始化阵列大小
因此,您的算法将如下所示:
public static void main(String[] args){
int[] a = {12, 13, 14,16};
filter(a, 15);
}
public static ArrayList<Integer> filter(int[] a, int b){
ArrayList<Integer> newArray = new ArrayList<>(); //dynamically increases as per the requirement
for(int i = 0; i < a.length; i++){
if(a[i] > b){ // Higher values, not lower
newArray.add(a[i]);
}
}
System.out.println(Arrays.toString(newArray.toArray()));
return newArray;
}
publicstaticvoidmain(字符串[]args){
int[]a={12,13,14,16};
过滤器(a,15);
}
公共静态ArrayList筛选器(int[]a,int b){
ArrayList newArray=newArrayList();//根据需要动态增加
for(int i=0;ib){//更高的值,而不是更低的值
新增(a[i]);
}
}
System.out.println(Arrays.toString(newArray.toArray());
返回新数组;
}
可以使用调试器检查数组的大小newArray
。提示:Java数组的大小是固定的。您不能向空数组中添加元素。“创建一个值高于给定值的新数组”那么为什么您的代码试图将低于b
的值分配给新数组?取决于未提及的要求。@Lothar它是通过OP的代码“提及”的。方法筛选器返回元素public static void main(String[] args){
int[] a = {12, 13, 14,16};
filter(a, 15);
}
public static ArrayList<Integer> filter(int[] a, int b){
ArrayList<Integer> newArray = new ArrayList<>(); //dynamically increases as per the requirement
for(int i = 0; i < a.length; i++){
if(a[i] > b){ // Higher values, not lower
newArray.add(a[i]);
}
}
System.out.println(Arrays.toString(newArray.toArray()));
return newArray;
}