2012-04-26 75 views
0

String類型的ArrayList。我想確定這個ArrayList的任何元素是否以一個指定的字符串開始,如果ArrayList包含這個元素,那麼我想要得到這個元素的索引。另外,我不想循環這個ArrayList來得到那個元素的索引。Java的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指數)

我怎樣才能做到這一點?

在此先感謝。

+1

您需要使用循環 – 2012-04-26 18:04:48

+1

ArrayList的設計不支持您描述的操作。希望你能在這裏控制選擇不同的數據結構來支持你的搜索需求? – sblom 2012-04-26 18:05:18

+1

@Predoryx這裏沒有魔法,循環非常真實 – ant 2012-04-26 18:05:39

回答

10

你必須循環ArrayList中。你不可能訪問一個單一的索引,並保證它是你正在尋找的。

此外,你應該考慮使用其他數據結構,如果有很多搜索的是參與。搜索一個ArrayList需要O(n)時間,而像紅黑樹這樣的東西可以在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:"); 
} 
+0

當然,比較是**區分大小寫**。 – Lion 2012-04-26 18:15:46

+0

@Bitmap'現在,我想通過使用vkl獲得元素vkl:gtr的索引:'你假設他有完整的字符串 – ant 2012-04-26 18:16:55

0

我真的不明白,如果你正在尋找的東西像鍵值對或單字符串項搜索。 如果你正在尋找的,如果你要搜索一個關鍵 在這裏,你可以把使用

put(Object key, Object value) 

一對,你應該使用地圖,而不是一個簡單的數組的第一個和得到一個指定鍵的值與

get(Object key) 

如果你只looing查找字符串的一部分到一個數組中的快捷方式,你必須閱讀所有的指標,並通過一個使用stringToCompare.equalsIgnoreCase(otherStringToCompare)比較字符串之一。請注意,如果stringToCompare爲NULL,則會引發異常

1
for(int i=0; i < asd.size(); i++) { 
    String s = asd.get(i); 
    //search the string 
    if(found) { 
     return i 
    } 
} 
return -1