【问题标题】:How to get the previous key/value and the next key/value in Maps如何在 Maps 中获取上一个键/值和下一个键/值
【发布时间】:2015-05-07 11:03:38
【问题描述】:
for (Entry<Double, String> entry : map.entrySet()) { 
        Double key = entry.getKey(); 
        String value = entry.getValue(); 

        // double nextKey = ?
        // String nextvalue = ?

        // double prevKey = ?
        // String prevValue = ?
    } 

是否有可能在迭代地图时知道前一个元素和下一个元素是什么?

【问题讨论】:

  • 大多数地图没有保证顺序,所以不太可能。
  • LinkedHashMap - 看到这个stackoverflow.com/questions/2889777/…
  • 简短回答:不,不可靠。因此,Set 没有指定的顺序。您可以将上一个/下一个条目保存在一个单独的变量中,但是在这部分代码的连续调用中,条目的顺序可能不同。
  • @DaDaDom 实际上,有些集合支持这种导航,例如 NavigableSet 实现。
  • @SashaSalauyou 同意了,但是.entrySet() 的返回值并没有提到任何这样的订单,因此无法保证订单。

标签: java dictionary


【解决方案1】:

您可以为此使用NavigableMapentrySet() 的迭代器返回条目in ascending key order

NavigableMap<Double, String> myMap = new TreeMap<>();

//...

for (Map.Entry<Double, String> e : myMap.entrySet()) {
    Map.Entry<Double, String> next = myMap.higherEntry(e.getKey()); // next
    Map.Entry<Double, String> prev = myMap.lowerEntry(e.getKey());  // previous

   // do work with next and prev
}

每个条目检索都是 O(logN),因此对于完整迭代,这不是最有效的方法。为了更有效,在迭代时只需记住最后 3 个条目,并使用第 1 个作为上一个,第 2 个作为当前,第 3 个作为下一个,如@Malt suggests

【讨论】:

    【解决方案2】:

    TreeMapOrderedMapNavigableMap,将允许您向前和向后迭代,允许您分别使用 lowerKey()higherKey() 访问上一个和下一个键。但是,这可能不是最好的解决方案。

    您能否描述您要解决的实际问题,我们可以为您提供更合适的解决方案?

    【讨论】:

    • 我需要为地图中的每个新增内容生成密钥。计算取决于上一个值和下一个值,并且必须根据键对映射进行排序,这决定了新添加的位置。
    • lowerEntry 的复杂度是 O(1) 还是 O(log n)?毕竟,如果你已经有了一个指向元素的指针,那么在树中移动会很容易。
    • @NathanB 这是O(log n)。该参数是键而不是指针,因此在时间复杂度方面它的工作方式类似于get(),逻辑上类似于get(key-1)
    • @Kayaman 是否有带有元素链表的 TreeMap 实现以允许在 O(1) 中迭代?
    • @NathanB 这是一个不同的问题。完全迭代任何MapO(n)。您可以使用Iterator 自己轻松地跟踪下一个/当前/上一个元素,但由于大多数地图没有保证的迭代顺序,因此对所有这些元素都没有意义。
    猜你喜欢
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 2018-03-16
    • 2021-09-26
    • 1970-01-01
    • 2014-12-01
    相关资源
    最近更新 更多