对String数组进行二进制搜索无法选择大写项

时间:2015-03-26 18:46:34

标签: android arrays

我在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;,该应用程序运行正常。任何帮助?

1 个答案:

答案 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
}