我在Android应用程序中的字符串数组上使用Arrays.binarysearch。
我的数组有10个项目,其中一个是UPPER CASE条目。现在,我可以从数组中获取所有项目的索引,除了大写的一个,它显示了arrayIndexOutOfBound异常。
详情:我开发了一个带有两个活动的Android应用程序。 活动A 包含一个由字符串数组填充的列表(称为 infected )。当用户单击列表中的项目时,他将被带到活动B.单击的项目将通过putStringExtra方法与列表的OnItemClickListener一起发送到活动B.在活动B中,我试图在相同的字符串数组( infected )上获取收到的项目索引。所有其他项目都可以正常工作,除了一个UPPER案例(阵列中的第五项......艾滋病)。以下是我的代码的重要摘要:
的的strings.xml
<string-array name="infections">
<item>Acne vulgaris</item>
<item>Actinomycosis</item>
<item>Acute otitis media</item>
<item>African sleeping sickness</item>
<item>AIDS</item>
<item>Amebiasis</item>
<item>Anthrax</item>
</string-array>
ActivityA.java
String[] infections = getResources().getStringArray(R.array.all_inf);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String clicked = adapter.getItem(position);
Intent i = new Intent(ActivityA.this, ActivityB.class);
i.putExtra(CLICKED_STRING,clicked);
startActivity(i);
}
});
ActivityB.java
String[] infections = getResources().getStringArray(R.array.all_inf);
String received = getIntent().getStringExtra(ActivityA.CLICKED_STRING);
int index = Arrays.binarySearch(infections,received);
当项目&#34;艾滋病&#34;单击列表,应用程序给出arrayIndexOutOfBounds异常。当我取代&#34;艾滋病&#34;使用&#34; Aids&#34;,该应用程序运行正常。任何帮助?
答案 0 :(得分:1)
首先,您需要binarySearch()
的排序数组。
文档:
public static int binarySearch(Object [] array,Object value)
在API级别1中添加
对升序排序数组中的值执行二进制搜索 阵列。在未排序的数组中搜索具有未定义的结果。它的 如果有多个元素,也会找到未定义的元素 出现相同的元素。
参数
对要排序的数组进行数组搜索。
为要查找的元素值。
返回元素的非负索引或负索引 这是-index - 1,其中将插入元素。
如果没有看到您的代码,我认为您正在尝试执行以下操作:
import java.util.Arrays;
public class BinarySearch
{
public static void main(String[] args)
{
String[] array = {"hello", "there", "YOU"};
Arrays.sort(array);
int index = Arrays.binarySearch(array, "you");
System.out.print(array[index]);
}
}
哪会给你这个错误:
线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:-4 在BinarySearch.main(BinarySearch.java:18)
基本上,找不到元素,所以它返回负文档,如文档中所述。然后,如果您尝试访问数组中的索引-4,当然会得到索引超出范围的异常。
首先,请确保您没有访问数组中的负索引。 此外,如果数组中不存在String的小写版本,您可以执行类似这样的操作来检查大写版本:
import java.util.Arrays;
public class BinarySearch
{
public static void main(String[] args)
{
String[] array = {"hello", "there", "YOU"};
Arrays.sort(array);
int index = Arrays.binarySearch(array, "you");
if (index < 0){
String str = "you";
index = Arrays.binarySearch(array, str.toUpperCase());
}
if (index >= 0){
System.out.print(array[index]);
}
}
}
评论后编辑:
看起来这种方法对于你需要的东西会更好,只需使用for循环遍历列表:
将ActivityA代码保留在问题中。
ActivityB:
String[] infections = getResources().getStringArray(R.array.all_inf);
String received = getIntent().getStringExtra(ActivityA.CLICKED_STRING);
int index = -1;
for (int i = 0; i < infections.length; i++){
if (received.equals(infections[i]){
index = i;
break;
}
}
if (index != -1){
//use index
}