java.lang.ArrayIndexOutOfBoundsException: 索引 -1 在二进制搜索中超出长度 7 的范围
java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 7 on a binary search
我必须编写一个程序,通过输入“Prezzo”值来搜索“Nomi”的通讯员,但是当我进行二分查找时,出现错误:
java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 7 on a binary search
代码如下:
import java.io.*;
public class Blackfriday {
public static int ricercaBinaria(Double prezzi[], Double chiave) {
int inf = 0, sup = prezzi.length - 1;
while (inf <= sup) {
int med = (inf + sup) / 2;
if (prezzi[med] == chiave)
return med;
if (prezzi[med] < chiave)
inf = med + 1;
else
sup = med - 1;
}
return -1;
}
public static void main(String args[]) {
try {
InputStreamReader isr;
BufferedReader br;
double cerca;
isr = new InputStreamReader(System.in);// abilitato la lettura da tastiera
br = new BufferedReader(isr);// abilitato la lettura un rigo per volta
String nomi[] = { "picones", "vinile di Speranza", "Laurea", "King Mufasa", "Pentium Gold",
"Aethey Wind breaker ORO", "HeelCompletoSpaic1we" };
Double prezzi[] = { 2.0, 13.50, 23.0, 99.50, 120.0, 75.20, 999.99 };
System.out.println("Quanto vuoi spendere?");
String xStringa = br.readLine();// ricevo la digitazione in String
cerca = Double.parseDouble(xStringa);// Trasformo la String in double
System.out.println("Puoi comprare: " + nomi[ricercaBinaria(prezzi, cerca)]);
} catch (Exception e) {
System.out.println(e);
}
}
}
您的代码至少有两个问题。
ricercaBinaria
的前提是底层数据数组是有序的。您在测试中使用了无序数据
ricercaBinaria
将 return 给定参数 (Double
) 在数组中的索引。如果未找到,则 -1
将被 returned。因此,在将其用作索引数组之前,您需要检查 returned 索引以验证它确实是正的 - 否则该方法将失败并出现您看到的异常
- 注意双重相等,但这是另一个问题。
这是一个有效的代码:
- 在异常捕获的情况下始终显示堆栈跟踪,这将有助于调试
- 如果您管理“Double”对象并尝试将它们与 == 进行比较,它将比较它们的引用(内存中的地址)而不是其中包含的值。所以使用简单类型 double OR 比较对象与 equals() 方法。
public class Blackfriday {
public static int ricercaBinaria(double prezzi[], Double chiave) {
int inf = 0, sup = prezzi.length - 1;
while (inf <= sup) {
int med = (inf + sup) / 2;
if (prezzi[med] == chiave)
return med;
if (prezzi[med] < chiave)
inf = med + 1;
else
sup = med - 1;
}
return -1;
}
public static void main(String args[]) {
try {
InputStreamReader isr;
BufferedReader br;
double cerca;
isr = new InputStreamReader(System.in);//abilitato la lettura da tastiera
br = new BufferedReader(isr);//abilitato la lettura un rigo per volta
String nomi[] = {"picones", "vinile di Speranza", "Laurea", "King Mufasa", "Pentium Gold", "Aethey Wind breaker ORO", "HeelCompletoSpaic1we"};
double prezzi[] = {2.0, 13.50, 23.0, 99.50, 120.0, 75.20, 999.99};
System.out.println("Quanto vuoi spendere?");
String xStringa = br.readLine();//ricevo la digitazione in String
cerca = Double.parseDouble(xStringa);//Trasformo la String in double
System.out.println("Puoi comprare: " + nomi[ricercaBinaria(prezzi, cerca)]);
} catch (Exception e) {
e.printStackTrace();
}
}//main
}//classe
我必须编写一个程序,通过输入“Prezzo”值来搜索“Nomi”的通讯员,但是当我进行二分查找时,出现错误:
java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 7 on a binary search
代码如下:
import java.io.*;
public class Blackfriday {
public static int ricercaBinaria(Double prezzi[], Double chiave) {
int inf = 0, sup = prezzi.length - 1;
while (inf <= sup) {
int med = (inf + sup) / 2;
if (prezzi[med] == chiave)
return med;
if (prezzi[med] < chiave)
inf = med + 1;
else
sup = med - 1;
}
return -1;
}
public static void main(String args[]) {
try {
InputStreamReader isr;
BufferedReader br;
double cerca;
isr = new InputStreamReader(System.in);// abilitato la lettura da tastiera
br = new BufferedReader(isr);// abilitato la lettura un rigo per volta
String nomi[] = { "picones", "vinile di Speranza", "Laurea", "King Mufasa", "Pentium Gold",
"Aethey Wind breaker ORO", "HeelCompletoSpaic1we" };
Double prezzi[] = { 2.0, 13.50, 23.0, 99.50, 120.0, 75.20, 999.99 };
System.out.println("Quanto vuoi spendere?");
String xStringa = br.readLine();// ricevo la digitazione in String
cerca = Double.parseDouble(xStringa);// Trasformo la String in double
System.out.println("Puoi comprare: " + nomi[ricercaBinaria(prezzi, cerca)]);
} catch (Exception e) {
System.out.println(e);
}
}
}
您的代码至少有两个问题。
ricercaBinaria
的前提是底层数据数组是有序的。您在测试中使用了无序数据ricercaBinaria
将 return 给定参数 (Double
) 在数组中的索引。如果未找到,则-1
将被 returned。因此,在将其用作索引数组之前,您需要检查 returned 索引以验证它确实是正的 - 否则该方法将失败并出现您看到的异常- 注意双重相等,但这是另一个问题。
这是一个有效的代码:
- 在异常捕获的情况下始终显示堆栈跟踪,这将有助于调试
- 如果您管理“Double”对象并尝试将它们与 == 进行比较,它将比较它们的引用(内存中的地址)而不是其中包含的值。所以使用简单类型 double OR 比较对象与 equals() 方法。
public class Blackfriday {
public static int ricercaBinaria(double prezzi[], Double chiave) {
int inf = 0, sup = prezzi.length - 1;
while (inf <= sup) {
int med = (inf + sup) / 2;
if (prezzi[med] == chiave)
return med;
if (prezzi[med] < chiave)
inf = med + 1;
else
sup = med - 1;
}
return -1;
}
public static void main(String args[]) {
try {
InputStreamReader isr;
BufferedReader br;
double cerca;
isr = new InputStreamReader(System.in);//abilitato la lettura da tastiera
br = new BufferedReader(isr);//abilitato la lettura un rigo per volta
String nomi[] = {"picones", "vinile di Speranza", "Laurea", "King Mufasa", "Pentium Gold", "Aethey Wind breaker ORO", "HeelCompletoSpaic1we"};
double prezzi[] = {2.0, 13.50, 23.0, 99.50, 120.0, 75.20, 999.99};
System.out.println("Quanto vuoi spendere?");
String xStringa = br.readLine();//ricevo la digitazione in String
cerca = Double.parseDouble(xStringa);//Trasformo la String in double
System.out.println("Puoi comprare: " + nomi[ricercaBinaria(prezzi, cerca)]);
} catch (Exception e) {
e.printStackTrace();
}
}//main
}//classe