有幾種方法可以做到這一點。例如,無需刪除元素,您可以使用已排序的可導航集合,如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);
所以,當你輸入'a'你想要移除像8000字開始'a'?接下來發生什麼? – zapl
'Map>'有時被稱爲_multimap_?見例如[這裏](http://stackoverflow.com/questions/4109167/how-can-i-create-a-multimap-in-java-on-android) –
vlp
備註:如果你把這些單詞保存在一個排序列表中,所有以相同字母開頭的單詞都是連續的。因此找到第一個和最後一個單詞就足夠了,它可以很好地完成「SortedSet」。 – dhke