Как я могу получить несколько результатов поиска из ArrayList <String>? - PullRequest
1 голос
/ 18 июня 2020

У меня есть ArrayList типа String, который содержит имена пользователей. Я хочу получить из него все соответствующие результаты String. (Подобно результатам панели поиска социальной сети, показывающей несколько результатов)

Ex- my ArrayList<String>names is having data as

names.add("abc");
names.add("ab cdf");
names.add("bcd");

Я хочу найти строку «ab», тогда я должен получить все соответствующие строки, начинающиеся с ab, из имен ArrayList. Мой возвращаемый результат должен быть строками: ab c, ab cdf

Как мне написать для него код, используя java? Будет лучше, если получим и индексы. Решение должно быть эффективным. Спасибо

Ответы [ 4 ]

0 голосов
/ 18 июня 2020

Вы можете получить индекс строки, сопоставленной таким образом

List<Integer> indexes = IntStream.range(0, names.size())
                                 .filter(i -> names.get(i).startsWith("ab"))
                                 .boxed()
                             .collect(Collectors.toCollection(ArrayList::new));

Затем вы можете получить эту строку, используя индексы.

И таким образом вы можете получить список строк

List<String> list = IntStream.range(0, names.size())
                                     .filter(i -> names.get(i).startsWith("ab"))
                                     .map(i -> names.get(i))
                                 .collect(Collectors.toCollection(ArrayList::new));
0 голосов
/ 18 июня 2020

Простой способ собрать совпадающие строки:

List.of(new String[] { "ab", "ab cdf", "bcd"}).stream()
.filter(s -> s.startsWith("ab"))
.collect(Collectors.toList());

Если вам нужен индекс совпадающих строк:

var items = List.of(new String[] { "ab", "ab cdf", "bcd", "abc"});
var map = IntStream.range(0,items.size())
  .filter(i -> items.get(i).startsWith("ab"))
  .boxed()
  .collect(Collectors.toMap(i->i, i->items.get(i)));
0 голосов
/ 18 июня 2020

Вы можете использовать Map<Integer, String> в качестве результата, где ключ - это индекс, а значение String:

public static Map<Integer, String> find(String search, List<String> strings) {
    Map<Integer, String> result = new HashMap<>(strings.size());
    int index = 0;
    for(String s : strings) {
        if(s.startsWith(search)) result.put(index, s);
        index++;
    }
    return result;
}

которое вы затем можете назвать следующим образом:

System.out.println(find("ab", names));

Выводит что-то вроде:

{0=ab, 1=ab cdf}

DEMO

Другой способ - вернуть List<String> в результате, но строки, не соответствующие строка поиска заменяется на null:

public static List<String> find(String search, List<String> strings) {
    List<String> result = new ArrayList<>(strings);
    for(ListIterator<String> it = result.listIterator(); it.hasNext(); ) {
        if(!it.next().startsWith(search)) it.set(null);
    }
    return result;
}

Что печатает:

[ab, ab cdf, null]

DEMO 2

0 голосов
/ 18 июня 2020

Вы пробовали использовать метод startswith() строкового класса?

Примерный код для вашей идеи:

String searchInput = "ab";
    ArrayList<String> searchResult = new ArrayList<>();
    //the arraylist names must be somewhere in your code
    for(String name: names){
        if (name.startsWith(searchInput)) {
            searchResult.add(name);
        }   
    }

    return searchResult;

Сообщите мне, если это решит вашу задачу.

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