只拔出地图上的相关键

时间:2018-12-21 07:04:15

标签: java hashmap pattern-matching

我有一个整数输入,例如:[1,3,4]。

我也有一个固定/不变的地图:

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

我希望我的输出是所有相关键的对应字符串。

对于输入[1,3,4]的示例,输出应为:“ A,C,D”。

最有效的方法是什么?

我的想法是每次都遍历整个地图。
问题在于,我在android中有一个远程调用,该调用会提取一长串数据项,并且对列表中的每个项执行此操作似乎有点..效率低下。也许有一些更有效和/或更优雅的东西。也许使用模式

2 个答案:

答案 0 :(得分:1)

假设数组与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);

这给出了输出:

  

A C D


根据您的评论,可以使用以下字符串将其加入一个字符串:

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

答案 1 :(得分:0)

您可以遍历输入列表而不是映射。顺便说一句,这就是使用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"

注意 :我仅使用StringInteger来表示,您可以在那里使用实际的数据类型。