Нахождение свободного соответствия для строки в arraylist - PullRequest
1 голос
/ 28 июня 2010

У меня есть огромный список массивов, который содержит 1000 записей, из которых одна из них - "мир".И у меня есть слово "большой мир".Я хочу, чтобы слово «большой мир» сочеталось с «миром» в массиве.

Какой самый экономически эффективный способ сделать это?Я не могу использовать метод .contains списка массивов, и если я переберу все 1000 записей и сопоставлю их по шаблону, это будет очень дорого с точки зрения производительности.Я использую Java для этого.

Не могли бы вы дать мне знать, как лучше всего это сделать?

Приветствия, J

Ответы [ 4 ]

1 голос
/ 28 июня 2010

Вы можете разбить каждый отдельный элемент ArrayList на слова и остановиться, как только найдете один из них.

Полагаю, по вашему профилю вы разрабатываете на Java, с Lucene вы бы легко сделали что-то подобное

public class NodesAnalyzer extends Analyzer {   
    public TokenStream tokenStream(String fieldName, Reader reader) {

        Tokenizer tokenizer = new StandardTokenizer(reader)
        TokenFilter lowerCaseFilter = new LowerCaseFilter(tokenizer)
        TokenFilter stopFilter = new StopFilter(lowerCaseFilter, Data.stopWords.collect{ it.text } as String[])
        SnowballFilter snowballFilter = new SnowballFilter(stopFilter, new org.tartarus.snowball.ext.ItalianStemmer())

        return snowballFilter
    }   
}

    Analyzer analyzer = new NodesAnalyzer()

    TokenStream ts = analyzer.tokenStream(null, new StringReader(str)); 
    Token token = ts.next()

    while (token != null) {
       String cur = token.term()
       token = ts.next();
    }

Примечание: это код Groovy, который я скопировал из личного проекта, поэтому вам придется переводить такие вещи, как Data.stopWords.collect{ it.text } as String[] для использования с простой Java

1 голос
/ 28 июня 2010

Предполагая, что вы не знаете содержание элементов массива. вам придется пройти весь массив.

Пересечение массива обойдется вам в O (n).

Сортировка массива не поможет вам, потому что вы говорите о поиске строки в наборе строк. и все равно сортировка будет дороже. O (NlogN) * ​​1005 *

0 голосов
/ 14 июля 2014

У меня была очень похожая проблема.

Решена с помощью этого оператора if / else if.

if (myArrayList.contains(wordThatIsEntered) 
    && wordThatCantBeMatched.equals(wordThatIsEntered)) {

    Toast.makeText(getApplicationContext(), 
    "WORD CAN'T BE THE SAME OR THAT WORD ISN'T HERE", 
    Toast.LENGTH_SHORT).show(); 
} 

else if (myArrayList.contains(wordThatIsEntered)) {

    Toast.makeText(getApplicationContext(), 
    "FOUND THE EXACT WORD YOU ARE LOOKING FOR!", 
    Toast.LENGTH_SHORT).show(); 
}
0 голосов
/ 28 июня 2010

Если вам приходится искать в списке несколько раз, возможно, имеет смысл использовать sort() и binarySearch() методы Collections.

Приложение. Как отмечает @ user177883, стоимость сортировки O (n log n) должна быть сопоставлена ​​с результатами последующих поисков O (log n) . 1012 *

Слово «сердце» соответствует [слово] «ухо».

Поскольку точное совпадение недостаточно, такой подход будет неадекватным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...