【问题标题】:Java ArrayList searchJava 数组列表搜索
【发布时间】:2012-04-26 18:02:08
【问题描述】:

我有一个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: 而不循环数组列表来获取元素vkl: gtr 的索引。(搜索也应该不区分大小写,因此,使用vkl:VkL: 应该给出索引vkl: gtr)

我该怎么做?

提前致谢。

【问题讨论】:

  • ArrayList 并非旨在支持您所描述的操作。希望您可以在这里控制选择支持您的搜索要求的不同数据结构?
  • @Predoryx 没有魔法,循环非常真实
  • 要在不循环的情况下执行此操作,您需要创建某种搜索程序,可以有效地遍历可能的条目。您可能想对您正在尝试做的事情进行更多研究。
  • 这很简单:你要么循环,要么调用一个循环的函数。在底部总是有一个循环。

标签: java arraylist


【解决方案1】:

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

此外,如果涉及大量搜索,您应该考虑使用其他数据结构。搜索 ArrayList 需要 O(n)time,而像红黑树这样的东西可以在 O(log n) 中完成。

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

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

【讨论】:

    【解决方案2】:

    这是如果您不想执行循环并搜索数组列表中保存的字符串对象,您可以满足您的要求。

    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:");
    }
    

    【讨论】:

    • @Bitmap Now, I want to get the index of the element vkl: gtr by using vkl: 你假设他有完整的字符串
    【解决方案3】:
    for(int i=0; i < asd.size(); i++) {
        String s = asd.get(i);
        //search the string
        if(found) {
            return i
        }
    }
    return -1
    

    【讨论】:

      【解决方案4】:

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

      put(Object key, Object value) 
      

      以及获取指定键的值

      get(Object key) 
      

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

      【讨论】:

        猜你喜欢
        • 2015-02-12
        • 1970-01-01
        • 2010-09-23
        • 2011-06-22
        • 2016-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-17
        相关资源
        最近更新 更多