2014-02-28 51 views
0

我想查找启动字母的索引,然后在java中的数组或列表中显示该项目的索引。 例如:我有:如何查找数组中项目的索引java

String[] arr={"apple","at","book","bad","car","cat"}; 

当我输入一个:然后我将得到索引= 0,b:我会得到索引= 2,C:我将得到索引= 4

由于我的数组项目超过20,000,所以使用线性搜索速度太慢。 和我的列表未排序,所以我也不能使用二进制搜索。 我想获得像上面的例子的项目的索引,我可以用这个解决什么?

+0

数组是动态还是恒定? –

+1

如果你有一个未排序的列表,一个以字母x开头的任意项目的索引是无用的,我想。 – Smutje

+0

该数组是恒定的 –

回答

0

如果你想的话所有的索引开始具有一定的字母,然后试试这个:

同时加入的话你的阵列/列表(将保留所有的话),你也可以将其添加到每个第一个字母都包含所有索引的地图。

Map<String, ArrayList<Integer>> myMap = new HashMap<String, ArrayList<Integer>>(); 

public void yourmethod() { 
    //adding all your words to an Array/arraylist goes here. (arr[] in this case) 

    string firstLetter = yourword.substring(0,1); 

    if(myMap.constainsKey(firstLetter)) { 
     myMap.get(letter).add(yourword); 
    } else { 
     myMap.put(firstLetter, yourword); 
    } 
} 
+0

因此,如果用户继续键入下一个字母,例如:ap?先生,它可以帮助吗? –

+0

ap?你是不是说启动信(一封信)? – Henrik

+0

不仅仅是一个,搜索就像是词典中的搜索词。一个字母,另一个字母,... –

0

您可以运行一些初始化代码(在用户开始键入字母之前)。

// initialize an array that has a cell for each letter with value -1 
int[] firstIndexes = new int[26]; 
for(int i=0;i<firstIndexes.length;i++) { 
    firstIndexes[i] = -1; 
} 

// loop over original array and look for each letter's first occurence 
for(int i=0;i<wordsArray.length;i++) { 
    char c=wordsArray[i][0]; 
    if(firstIndexes[c-'a'] < 0) { 
     firstIndexes[c-'a'] = i; 
    } 
} 

然后,当用户键入一个字母,你只需要在'firstIndexes'数组中找到它的索引。