【问题标题】:How get value from LinkedHashMap based on index not on key? [duplicate]如何根据索引而不是键从 LinkedHashMap 获取值? [复制]
【发布时间】:2012-11-27 10:18:42
【问题描述】:

我有

LinkedHashMap<String, List<String>> hMap;

我想通过位置获得List&lt;String&gt;而不是关键。

我不想使用迭代。

还有其他方法可以根据索引获取价值吗?

【问题讨论】:

  • 如果你自己选择这个数据结构,那么它可能不是这个任务的最佳选择。
  • @NikolayKuznetsov:你能建议我如何构建它吗?
  • ArrayList 如果您仅按索引提取元素
  • 好的,谢谢,但现在我正在使用密钥来获取价值。索引不是一个好主意...再次感谢...
  • 为什么这个问题没有参考所谓的好答案就关闭了。这里的所有答案都不好。

标签: java android linkedhashmap


【解决方案1】:

您无法根据索引获取Map 的值,Maps 只是不能那样工作。一种解决方法是根据您的值创建一个新列表并根据索引获取值。

LinkedHashMap<String, List<String>> hMap;
List<List<String>> l = new ArrayList<List<String>>(hMap.values());
l.get(0);

【讨论】:

  • 如果我想根据索引插入值?如何做到这一点?
  • 这是我发布的答案,我不能在这里发布,这个帖子被锁定:stackoverflow.com/a/31749969/961018
【解决方案2】:
public List<String> getByIndex(LinkedHashMap<String, List<String>> hMap, int index){
   return (List<String>) hMap.values().toArray()[index];
}

【讨论】:

  • 如果地图中有很多条目经常调用,这可能会很昂贵
【解决方案3】:

您可能需要考虑使用另一个类来存储您的数据,或者为linkedHashMap 编写一个扩展。像

//this is pseudo code
public class IndexedLinkedHashMap<K,V> extends LinkedHashMap{

HashMap<int,K> index;
int curr = 0;

    @Override
    public void add(K key,V val){
        super.add(key,val);
        index.add(curr++, key);
    }

    public V getindexed(int i){
        return super.get(index.get(i));
    }

}

【讨论】:

    【解决方案4】:

    正如 Kevin Bowersox 所说,它很简单

    List<String> result = (List<String>) hMap.values().toArray()[position];
    

    但需要注意的是,这仍然会使用 .toArray() 进行迭代。这是一个简单的语句,我不确定是否有一个性能更好的语句,但请注意复杂性不是 log(n)(如 B* 的索引访问),而只是 n。 由于LinkedHashMap是基于LinkedList的,所以没有办法随机访问元素,只能按顺序访问。

    转换为 List 是不可避免的邪恶,因为 .toArray() 遵循返回 Object 而不是泛型数据类型的古老概念。

    虽然这可能不是地图的主要概念,但 LinkedHashMap 不仅仅是地图。它扩展了 HashMap,作为一个扩展类,引入支持该类特性的其他方法非常好。

    【讨论】:

    • 创建一个新数组..不是很漂亮
    • 这是我发布的答案,我不能在这里发布,这个帖子被锁定:stackoverflow.com/a/31749969/961018
    • @momo 我的帖子只是为了解释 Kevin Bowersox 的提议并没有避免迭代,而且没有这样的方法。通过手动迭代值可以很容易地避免创建数组,但是当问题是如何在不迭代的情况下进行时,这不是理想的答案。显然,您可以通过使用不同的索引概念创建自己的实现来避免这种情况,但这似乎与问题无关。
    【解决方案5】:

    标准 Java Collections API 中没有直接的 DS 来提供索引映射。但是,以下内容应该可以让您获得结果:

    // An ordered map
    Map<K, V> map = new LinkedHashMap<K, V>();
    // To create indexed list, copy the references into an ArrayList (backed by an array)
    List<Entry<K, V>> indexedList = new ArrayList<Map.Entry<K, V>>(map.entrySet());
    // Get the i'th term
    <Map.Entry<K,V>> entry = indexedList.get(index);
    K key = entry.getKey();
    V value = entry.getValue();
    

    您可能仍希望将地图中的数据持久性问题与检索分开。

    更新: 或者使用来自 Apache Commons 的 LinkedMap

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-16
      • 2023-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 2017-08-27
      • 1970-01-01
      相关资源
      最近更新 更多