2015-11-21 36 views
0

我爲android編寫應用程序。我有幾個詞(〜50000),我必須輸入從指定的字母開始的任何一個單詞並刪除單詞。我將所有單詞存儲在稀疏數組中,並從中讀取文件中的單詞。在這種情況下什麼是替換稀疏陣列以能夠添加相同的密鑰?

sparseArray = new SparseArray<String>();    
String str = ""; 
char c; 
while ((str = stream.readLine()) != null) { 
    c = str.charAt(0); 
    sparseArray.put(c, str); 
} 

,其中關鍵 - 在單詞的第一個字母,值 - 一個字。

當我收到一封信我選擇具有相同的第一字母

char receivedLetter; 
... 
String word = sparseArray.get(receivedLetter); 
sparseArray.removeAt(sparseArray.indexOfValue(word)); 
Log.d("myLogs", "word: " + word); 

但是稀疏陣列僅存儲26個元素的任何單詞,因爲具有相同的第一字母的詞(相同的密鑰)被overwrited並且僅保持最後一個字。 HashMap也不會決定問題。我應該用什麼來解決這個問題?

+1

所以,當你輸入'a'你想要移除像8000字開始'a'?接下來發生什麼? – zapl

+0

'Map >'有時被稱爲_multimap_?見例如[這裏](http://stackoverflow.com/questions/4109167/how-can-i-create-a-multimap-in-java-on-android) – vlp

+0

備註:如果你把這些單詞保存在一個排序列表中,所有以相同字母開頭的單詞都是連續的。因此找到第一個和最後一個單詞就足夠了,它可以很好地完成「SortedSet」。 – dhke

回答

2

有幾種方法可以做到這一點。例如,無需刪除元素,您可以使用已排序的可導航集合,如TreeSet。現在

TreeSet<String> words = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER); 
words.add("hello"); 
words.add("beta"); 
words.add("beat"); 
words.add("couch"); 
words.add("alpha"); 
words.add("Bad"); 

你可以做

NavigableSet<String> bWords = words.subSet("b", true, "c", false); 
System.out.println(bWords); // prints [Bad, beat, beta] 

而你給出的是>= b && < c字的子集。你可以這樣做

String removedWord = bWords.pollFirst(); // Bad 
System.out.println(bWords); // prints [beat, beta] 
// sub-sets affect their origin, they are "views on the original collection" 
System.out.println(words); // prints [alpha, beat, beta, couch, hello] 

而且你已經有效地刪除了一個單詞「b」。 A TreeSet的優點是您可以通過多種方式導航和搜索數據。

基於一個char魔術行代碼來刪除一個元素是

String removed = words.subSet(Character.toString(receivedLetter), true, 
      Character.toString((char) (receivedLetter + 1)), false) 
     .pollFirst(); 

另一種方法是集合的集合。像SparseArray<List<String>>()例如

SparseArray<List<String>> sparseArray = new SparseArray<List<String>>(); 
String str; 
while ((str = stream.readLine()) != null) { 
    char c = str.charAt(0); 
    // get or create list stored at letter c 
    List<String> list = sparseArray.get(c); 
    if (list == null) { 
     list = new ArrayList<String>(); 
     sparseArray.put(c, list); 
    } 
    // add word to list 
    list.add(str); 
} 

要刪除,你得到的名單,如果它不是空remove從它的元素。

char receivedLetter; 
    List<String> words = sparseArray.get(receivedLetter); 
    if (words != null && !words.isEmpty()) 
     words.remove(words.size() - 1); 
+0

我理解你的方法與SparseArray集合)。我現在試試看,謝謝。 – Log

+0

是的,SparseArray方法工作得很好。非常感謝偉大的解決方案! – Log