我有这种数据结构
Map<Integer, Integer> groupMap= new LinkedHashMap<>();
groupMap.put(10, 1);
groupMap.put(11, 0);
groupMap.put(14, 1);
groupMap.put(13, 0);
groupMap.put(12, 0);
groupMap.put(15, 1);
如果我有一个具有一个值的当前键,那么找到值为1的键的最佳方法是什么。 例如:我有密钥14,现在需要找到值为1的密钥15
最少循环将有所帮助。
我的approch:
List<Integer> keys = new ArrayList<>();
keys.putAll(groupMap.keySet());
//getting the index of current key i have
int index = keys.indexOf(14);
if(keys.size() == index) return -1;
for(int i = index+1;i<keys.size();i++){
if(groupMap.get(i) == 1) return i;
}
我知道这不是一个非常好的方法,但是你可以建议一个好方法。
答案 0 :(得分:1)
这完全违背了键值映射的目的。但如果它真的是你想要的,我想你可以做到以下几点:
public static int getNextKeyByValue(int value, int previousKey) {
final Map<Integer, Integer> groupMap = new HashMap<>();
Iterator iterator = groupMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<Integer, Integer> entry = (Map.Entry<Integer, Integer>) iterator.next();
if (entry.getValue() == value && entry.getKey() != previousKey) {
return entry.getKey();
}
}
return -1;
}
答案 1 :(得分:0)
我还没有真正清楚你的问题。如果您正在寻找值等于1的所有元组,您可以按照以下方法:
for (Entry<Integer, Integer> entry : groupMap.entrySet()) {
if (entry.getValue() == 1) {
System.out.println("The key is: " + entry.getKey().toString());
}
}
答案 2 :(得分:0)
从@Titus评论中提到的topic,最优雅,最简短的解决方案是使用流:
int getFirstCorrectValueBiggerThan (int lastValue) {
return groupMap.entrySet().stream()
.filter(entry -> Objects.equals(entry.getValue(), 1))
.map(Map.Entry::getKey)
.filter(value -> value > lastValue)
.findFirst();
}
修改强> 抱歉这个错误,提供的代码无法解决您的问题,因为它是比较键而不是索引。在这里你有正确的版本,但它不再那么酷了。
ArrayList<Integer> filteredList = groupMap.entrySet().stream()
.filter(entry -> entry.getValue().equals(1))
.map(Map.Entry::getKey)
.collect(Collectors.toCollection(ArrayList::new));
int nextCorrectElement = filteredList.get(filteredList.indexOf(14) + 1);
<强>更新强> 据我所知,in this tutorial关于地图的内容是什么:
当用户调用put(K键,V值)或get(Object键)时,该函数计算条目应该在其中的桶的索引。然后,函数遍历列表以查找具有相同键的Entry(使用键的equals()函数)。
并查看有关哈希映射复杂性的this topic。
O(1)当然不能得到保证 - 但在考虑使用哪种算法和数据结构时,通常应该考虑这一点。
最重要的是,解决方案的关键部分 - ArrayList::indexOf
- O(N)复杂 - 您必须遍历每个元素,直到符合条件的元素为止。更多信息是in this topic。
无论如何,你有效地遍历了hashmap的每个元素。而且,hashmap搜索(get
方法)不能保证是O(1)复杂的,所以你有可能将你的工作翻倍。
我已经对本主题中提出的基于流的解决方案和简单循环进行了简单的性能测试。事实上,对于我认为的每种情况,循环将比顺序流更快,但是如果你想要那种性能增益,那么尝试用C ++编写它。否则,如果您有更复杂的示例,那么使用并行流可能会获得一些优势,因为问题的抽象级别更高。