我有一个整数输入,例如:[1,3,4]。
我也有一个固定/不变的地图:
1 -> A
2 -> B
3 -> C
4 -> D
5 -> E
我希望我的输出是所有相关键的对应字符串。
对于输入[1,3,4]的示例,输出应为:“ A,C,D”。
最有效的方法是什么?
我的想法是每次都遍历整个地图。
问题在于,我在android中有一个远程调用,该调用会提取一长串数据项,并且对列表中的每个项执行此操作似乎有点..效率低下。也许有一些更有效和/或更优雅的东西。也许使用模式
答案 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);
}
在java-stream的帮助下可以更改为
List<String> information = query.stream()
.map(data::get) // looking up here
.collect(Collectors.toList()); // returns "A,C,D"
注意 :我仅使用String
和Integer
来表示,您可以在那里使用实际的数据类型。