Как проверить, что строка содержит одну из строк в коллекции - PullRequest
0 голосов
/ 19 декабря 2018

Я хочу проверить, содержит ли целевая строка строку в коллекциях.И соответствует самый длинный.Например,

Целевая строка: str = "eignelaiwgn"

Строки коллекции: eig, a, eb, eigne, eignep

Требуется результатбыть eigne

Сначала я подумал о HashMap, но он не отсортирован.Поэтому я пытаюсь поместить строки коллекции в ArrayList, а затем отсортировать список по длине строки.Затем используйте цикл for each, чтобы проверить

if ( str.contains("eigne") )

. Этот список нужно каждый раз зацикливать.Есть ли лучший (более быстрый) способ добиться этого?

Ответы [ 4 ]

0 голосов
/ 19 декабря 2018

Кажется довольно простым с потоками:

String targetString = "eignelaiwgn";
Collection<String> collection = Arrays.asList("eig", "a", "eb", "eigne", "eignep");

Optional<String> longestMatch = collection.stream()
    .filter(targetString::contains)
    .max(Comparator.comparingInt(String::length));

longestMatch.ifPresent(System.out::println); // eigne

Это читается как: Для каждой строки в коллекции, проверьте, содержит ли целевая строка ее.Если true, вернуть строку с максимальной длиной.(Поскольку коллекция может быть пустой или строка не может соответствовать фильтру, max возвращает Optional<String>) .

0 голосов
/ 19 декабря 2018

Вы можете использовать TreeSet для того же самого.

String str = "eignelaiwgn";
// Assuming that the 'sub-strings' are stored in a list
List<String> myList = Arrays.asList("eig", "a", "eb", "eigne", "eignep");

// Create a TreeSet that sorts based on descending order of length
Set<String> treeSet = new TreeSet<>((a, b) -> b.length() - a.length());
treeSet.addAll(myList);

String containsSub = treeSet.stream().filter(e -> str.contains(e))
                            .findFirst()
                            .orElse("Not found");

Теперь мы перебираем TreeSet и находим first вхождение, где подстрока присутствует воригинальная строка.Теперь, поскольку TreeSet отсортировано в порядке убывания длины, итерация начнется с самого высокого до самого низкого.

0 голосов
/ 19 декабря 2018

Вы можете использовать дерево суффиксов.Пожалуйста, перейдите по этой ссылке: https://www.geeksforgeeks.org/pattern-searching-using-suffix-tree/

0 голосов
/ 19 декабря 2018

вы можете использовать метод LevensteinDistance () класса StringUtils в java, который сообщит вам количество изменений, необходимых для замены одной строки на другую. Вы можете напечатать строку с минимальными необходимыми изменениями, что является вашим ответом.см. этот документ -> LevenshteinDistance

Также ищите метод различий для того же класса, который сообщит разницу между двумя строками.

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