【问题标题】:Java Collection with index, key and value具有索引、键和值的 Java 集合
【发布时间】:2013-11-04 06:03:25
【问题描述】:

我的问题可能听起来很傻,但想知道 Java 中是否有任何 Collection 对象将索引、键和值存储在单个 Collection 对象中?

我有以下几点:

Enumeration hs = request.getParameterNames();
LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<String, String>();
while (hs.hasMoreElements()) {
    linkedHashMap.put(value, request.getParameter(value));
}

上面存储了linkedHashMap中的key和value,但它没有索引。如果有,那么我可以通过 index(pos) 调用并获取相应的键和值。

编辑 1

我想有条件地检查 index(position) 是否为 x 然后获取相应的键值对并构造一个带有查询的字符串。

【问题讨论】:

  • 如果你能解释一下你的功能需求会更好。
  • 无论如何,如果你知道你的Map 不会改变,你可以创建一个List&lt;Map.Entry&lt;String, String&gt;&gt; indexedKV = new ArrayList(linkedHashMap.entrySet());
  • construct a string with query 现在我更想知道为什么您需要使用索引而不是仅仅通过键检索所需的值...
  • 你曾经通过钥匙访问地图吗?还是仅按索引?
  • 如果你有一个已知的键 K 和一个已知的索引 N,并且你正在查找索引 N 处的项目,检查它的键是否为 K,然后获取它的值,那么你不妨只是直接从键中获取值,因为您已经知道键是什么。如果您从不通过键访问并且仅通过索引访问,那么您可能根本不使用地图。所以这一切都取决于。请说明为什么关键 K 位于特定索引 N 很重要。另外请说明您的性能要求(为什么不手动迭代到 LinkedHashMap 中的位置 N?)

标签: java collections


【解决方案1】:

正如其他人所提到的,Java 集合不支持这一点。解决方法是Map&lt;R, Map&lt;C, V&gt;&gt;。但是使用起来太丑了。 您可以选择 Guava。它提供了一个 Table 集合类型。它具有以下格式Table&lt;R, C, V&gt;。我还没有尝试过,但我认为这对你有用。

Enumeration hs = request.getParameterNames();
Table<Integer, String, String> table = HashBasedTable.create();
while (hs.hasMoreElements()) {
    table.put(index, value, request.getParameter(value));
}

现在,如果您希望 key, value 对位于索引 1。只需执行table.row(1)。同样,要获得 index、value 对,只需执行 table.column(value)

【讨论】:

  • Mandrake,很好,你已经指出了这一点,为什么你提到它太难看了?有什么特别的原因吗?
  • @Polppan:在Map&lt;R, Map&lt;C, V&gt;&gt; 中,您将首先为key, value 创建一个映射,然后将其放入上面的Map。但是Table&lt;R, C, V&gt; 让您只需一步即可完成此操作。这就是我说的理由。
  • 感谢 Mandrake,这正是我想要的。不知道为什么人们投票结束这个问题。
【解决方案2】:

Java 中没有集合,将支持这一点。 您需要创建一个新类 IndexedMap 继承 HashMap 并将关键对象存储到 arraylist 通过覆盖 put 方法。

这是答案(由另一位用户回答:Adriaan Koster)

how to get the one entry from hashmap without iterating

【讨论】:

    【解决方案3】:

    也许您需要自己实现才能实现此功能。

    public class Param{
        private String key;
        private String value;
        public Param(String key, String value){
            this.key = key;
            this.value = value;
        }
        public void setKey(String key){
            this.key = key;
        }
        public String getKey(){
            return this.key;
        }
    
        public void setValue(String value){
            this.value = value;
        }
        public String getValue(){
            return this.value;
        }
    }
    
    Enumeration hs = request.getParameterNames();
    List<Param> list = new ArrayList<Param>();
    while (hs.hasMoreElements()) {
        String key = hs.nextElement();
        list.add(new Param(key, request.getParameter(key)));
    }
    

    通过这样做,您可以使用 List API 提供的索引获取参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      相关资源
      最近更新 更多