Я хотел бы поблагодарить всех вас за усилия, приложенные вами при ответе на мой вопрос, все они были очень полезны, и взяв лучшее из каждого из них, я заставил меня найти решение, которое я фактически реализовал в своем проекте.
Что я считаю лучшим ответом на мои одиночные вопросы:
2) Нет итератора, определенного в TreeMaps как @Isoliveira sais:
There's no such implementation in the JDK itself.
Although TreeMap iterates in natural key ordering,
its internal data structures are all based on trees and not arrays
(remember that Maps do not order keys, by definition,
in spite of that the very common use case).
и как я нашел в этом SO-ответе Как перебирать TreeMap? , единственный способ перебирать элементы в Map
- это использовать map.entrySet()
и использовать итераторы, определенные в Set
(или некоторый другой класс с Итераторами.)
3) Можно использовать TreeMap
для реализации словаря, но это гарантирует сложность O (logN) в поиске индекса содержащегося в нем слова (стоимость поиска в древовидной структуре данных).
Использование HashMap
с такой же процедурой будет иметь сложность O (1).
1) Такого метода не существует.Единственное решение - реализовать его целиком.
Как сказал @Paul
Assumes that once getPosition() has been called, the dictionary is not changed.
предположение о том, что после создания словаря оно не будет изменено впоследствии: таким образом, положениеслово всегда будет одним и тем же.
Исходя из этого предположения, я нашел решение, которое позволяет построить словарь со сложностью O (N) и после гарантии получить возможность получить индекс слова, содержащегося с постоянным временем O (1)в поиске.
Я определил словарь как HashMap
следующим образом:
public HashMap<String, WordStruct> dictionary = new HashMap<String, WordStruct>();
- ключ ->
String
, представляющий слово, содержащееся в словаре - значение ->
Object
созданного класса WordStruct
, где WordStruct
класс определяется следующим образом:
public class WordStruct {
private int DictionaryPosition; // defines the position of word in dictionary once it is alphabetically ordered
public WordStruct(){
}
public SetWordPosition(int pos){
this.DictionaryPosition = pos;
}
}
и позволяет мне сохранитьПамять любого вида атрибута, который мне нравится связывать со словом «Словарь».
Теперь я заполняю словарь, перебирая все слова, содержащиеся во всех файлах моей коллекции:
THE FOLLOWING IS PSEUDOCODE
for(int i = 0; i < number_of_files ; i++){
get_file(i);
while (file_contais_words){
dictionary.put( word(j) , new LemmaStruct());
}
}
Один разHashMap заполняетсяВ порядке порядка я использую процедуру, указанную @dasblinkenlight, чтобы упорядочить ее раз и навсегда со сложностью O (N)
Object[] dictionaryArray = dictionary.keySet().toArray();
Arrays.sort(dictionaryArray);
for(int i = 0; i < dictionaryArray.length; i++){
String word = (String) dictionaryArray[i];
dictionary.get(word).SetWordPosition(i);
}
И отныне для того, чтобы иметь индексную позицию в алфавитном порядке слова в словаре, требуется толькодля доступа это переменная DictionaryPosition
:
, так как слово известно, вам просто нужно получить к нему доступ, и это имеет постоянную стоимость в HashMap
.
Еще раз спасибо и желаю всем вамСчастливого Рождества !!