Вытащите только подходящие ключи с карты - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть ввод int arry, например: [1,3,4].

У меня также есть фиксированная / постоянная карта:

1 -> A
2 -> B
3 -> C
4 -> D
5 -> E

Я хочу свой выводбыть соответствующей строкой всех соответствующих ключей.

Для нашего примера ввода [1,3,4], вывод должен быть: "A, C, D".

Чтосамый эффективный способ достижения этого?

Моя идея состояла в том, чтобы каждый раз повторять всю карту.
Проблема в том, что у меня есть удаленный вызов в Android, который выбирает длинный списокэлементы данных, и выполнение этого для каждого элемента в списке кажется немного .. неэффективным.Может быть, есть что-то более эффективное и / или более элегантное.Возможно использование Patterns

Ответы [ 2 ]

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

Вы можете перебирать список ввода вместо карты.Кстати, это преимущество использования Map, время поиска которого равно O(1) с надлежащим хешированием.Это будет выглядеть примерно так:

Map<Integer, String> data = new HashMap<>();
List<Integer> query = new ArrayList<>(); // your query such as "1,3,4"


List<String> information = new ArrayList<>();
for (Integer integer : query) {
    String s = data.get(integer); // looking up here
    information.add(s);
}

, который с помощью можно изменить на

List<String> information = query.stream()
        .map(data::get) // looking up here
        .collect(Collectors.toList()); // returns "A,C,D"

Примечание : я использовал String и Integer только для представления, вместо этого вы можете использовать ваши фактические типы данных.

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

Предполагая, что массив определен, как показано ниже, вместе с HashMap:

int arr[] = { 1, 3, 4 };
HashMap<Integer, String> hmap = new HashMap<>();

// data in the map
hmap.put(1, "A"); hmap.put(2, "B"); hmap.put(3, "C"); hmap.put(4, "D"); hmap.put(5, "E");

Вместо того, чтобы перебирать всю карту, вы можете перебирать массив

String[] array = Arrays.stream(arr).mapToObj(i -> hmap.get(i))
                       .filter(Objects::nonNull)
                       .toArray(String[]::new);

Этодает вывод:

ACD


Согласно вашему комментарию, чтобы присоединиться к нему как одна строка, вы можете использовать:

String str = Arrays.stream(arr).mapToObj(i -> hmap.get(i))
                   .filter(Objects::nonNull)
                   .collect(Collectors.joining("/"));
...