想象一下,我们有两个列表,想要知道另一个列表中元素的位置。举例说明:
List<String> one = Arrays.asList("B", "I", "G");
List<String> another = Arrays.asList("L", "A", "R", "G", "E");
结果将是:
[-1, -1, 3]
因为B和I都不出现在第二个列表中,但是G出现在第三个位置。
这是我到目前为止所得到的:
<E> List<Integer> indices(List<E> elements, List<E> container) {
List<Integer> indices = new ArrayList<>(elements.size());
for (int i = 0; i < elements.size(); i++) {
indices.add(container.indexOf(indices.get(i)));
}
return indices;
}
是否有更快的解决方案可以避免List.indexOf()
中的内部循环?
答案 0 :(得分:4)
您可以使用Map
:
Map<String, Integer> otherMap = new HashMap<>(other.size());
int index = 0;
for(String otherElem : other) {
otherMap.put(otherElem, index++);
}
然后:
for(String oneElem : one) {
Integer index = otherMap.get(oneElem);
indices.add(index == null ? -1 : index);
}
这样做,您可以直接获取索引,而不是每次查找和索引时都在可能非常大的列表上进行迭代。
答案 1 :(得分:2)
您可以使用HashMap<String, Integer>
将每个角色映射到其位置。然后使用HashMap
方法.containsKey()
查找字段中是否存在某个字符串,.get()
找出该位置。
HashMap<String, Integer> another;
for (String str : one) {
if (another.contains(str)) {
result.add(another.get(str));
} else {
result.add(-1);
}
}