0

我有一个ArrayList类型String。我想确定此元素是否ArrayList以指定的字符串开头,如果ArrayList包含此元素,那么我想获取此元素的索引。另外,我不想循环这个ArrayList来获取那个元素的索引。

例如 :

ArrayList<String> asd = new ArrayList<String>();  // We have an array list

//We filled the array list
asd.add("abcc trtiou");
asd.add("aiwr hiut qwe");
asd.add("vkl: gtr");
asd.add("aAgiur gfjhg ewru");

现在,我想vkl: gtr通过使用vkl:不循环数组列表来获取元素的索引。(搜索也应该不区分大小写,所以,使用vkl:VkL:应该给出的索引vkl: gtr

我怎样才能做到这一点 ?

提前致谢。

4

4 回答 4

11

您必须循环 ArrayList。您不可能只访问一个索引并保证它就是您要查找的内容。

此外,如果涉及大量搜索,您应该考虑使用其他数据结构。搜索 ArrayList 需要O(n)时间,而在O(log n).

如果您在程序执行之前知道用于定位结构中项目的字符串,请考虑使用 HashMap。您可以访问 中的项目O(1)

如果这些解决方案都不适合您的特定问题,请根据您正在尝试做的事情扩展您的答案,我们可以提供更好的答案,说明您如何在最短的搜索时间内找到您的项目。

于 2012-04-26T18:04:34.540 回答
2

如果您不希望执行循环并搜索 arraylist 中保存的字符串对象,这是您可以满足的要求。

if(asd.contains("vkl: gtr"))
{
  int index=asd.indexOf("vkl: gtr");
}

或者简单地说:

int index = Arrays.binarySearch(asd.toArray(), 0, asd.size()-1, "vkl: gtr");

如果在您的调用方法中执行循环是您想要避免的,那么您可以创建一个扩展的类ArrayList并拥有一个执行索引查找的方法。

  class MyArray extends ArrayList<String>
  {
    public int getIndexOf(String o)
    {
      for (int i = 0; i < size(); i++)
      {
        if (get(i).contains((String) o)) return i;
      }
      return -(size() - 1);
    }
  }

然后从您的调用程序执行:

public void foo()
{
    MyArray asd = new MyArray();
    asd.add("abcc trtiou");
    asd.add("aiwr hiut qwe");
    asd.add("vkl: gtr");
    asd.add("aAgiur gfjhg ewru");

    int index = asd.getIndexOf("vkl:");
}
于 2012-04-26T18:11:48.660 回答
1
for(int i=0; i < asd.size(); i++) {
    String s = asd.get(i);
    //search the string
    if(found) {
        return i
    }
}
return -1
于 2012-04-26T18:12:16.860 回答
0

我真的不明白您是否正在寻找诸如键值对或单字符串条目搜索之类的东西。如果你正在寻找第一个,你应该使用 Map 而不是一个简单的数组,如果你想搜索一个键在这里你可以使用一对

put(Object key, Object value) 

并获取指定键的值

get(Object key) 

如果您只是为了快速将字符串的一部分查找到数组中,则必须读取所有索引并使用 stringToCompare.equalsIgnoreCase(otherStringToCompare) 逐个比较字符串。请注意,如果 stringToCompare 为 NULL,这将引发异常

于 2012-04-26T18:11:52.490 回答