当前位置: 首页 > 知识库问答 >
问题:

使用键和值分别从linkedHashMap创建新数组

尉迟国发
2023-03-14

我有一个LinkedHashMap,我正在尝试拆分它的键和值,并引用键集中的特定键或值集中的值。例如,假设我有以下LinkedHashMap:

4 |2

3|1

我想要一个函数返回1,这是一个集合中索引为1的值,或者对于索引= 0返回2。对于另一个函数,我想得到键值为3,索引为1的键值。所以基本上从LinkedHashMap创建一个只有值/键的数组,然后在这个数组中寻找某个给定的位置。我的代码如下所示:

    public static Integer getLHMValue(Map<Integer, Long> lhm, int index) { 
        Set<Map.Entry<Integer, Long>> valueSet = lhm.entrySet();
        Integer[] valueArray = valueSet.toArray(new Integer[valueSet.size()]);
        Integer value = valueArray[index];
        return value;
    }

    public static Integer getLHMKey(Map<Integer, Long> lhm, int index) { 
        Set<Integer> keySet = lhm.keySet();
        Integer[] keyArray = keySet.toArray(new Integer[keySet.size()]);
        Integer key = keyArray[index];
        return key;
}

虽然,我得到java.lang.ArrayStoreException:java.util.LinkedHashMap$条目:整数[]keyArray=valueSet.toArray(新整数[valueSet.size ()]);. 有什么想法吗?

共有3个答案

井学
2023-03-14

问题是entrySet首先需要有一个Map.Entrys数组。为这两种方法保留这样的数组会更快。

List<Map.Entry<Integer, Long>> entries = new ArrayList<>(lhm.entrySet());

public static long getLHMValue(Map<Integer, Long> lhm, int index) { 
    return entries.get(index).getValue();
}

public static int getLHMKey(Map<Integer, Long> lhm, int index) { 
    return entries.get(index).getKey();
}

如果您直接这样做,则没有有效的解决方案,因此不建议提供这些功能来访问键和值。

public static Long getLHMValue(Map<Integer, Long> lhm, int index) { 
    return lhm.entrySet().stream()
        .map(Map.Entry<Integer, Long>::getValue)
        .skip(index)
        .findFirst()
        .orElseThrow(IndexOutOfBoundsException::new);
}

public static Integer getLHMKey(Map<Integer, Long> lhm, int index) { 
    return lhm.entrySet().stream()
        .map(Map.Entry<Integer, Long>::getKey)
        .skip(index)
        .findFirst()
        .orElseThrow(IndexOutOfBoundsException::new);
}
孔扬
2023-03-14

首先,最好选择Collections而不是Array,因为集合可以为您提供行为,而数组由于其协变行为而存在类型安全隐患(请参阅Joshua Bloch的“Effective Java”,项目“Prefer lists to array”)。

由于映射总是相同的(OP在注释中提供了澄清),您可以将列表声明stitic Final变量,将映射条目转储到其中并从您的方法访问此列表。

这样可以避免每次方法调用都执行不必要的迭代,这会花费O(n)个时间。

public static final Map<Integer, Long> LHM = // initializing the map
public static final List<Map.Entry<Integer, Long>> ENTRIES = new ArrayList<>(LHM.entrySet());

有了这个变化,你的方法将在恒定时间O(1)而不是线性工作。

public static Long getLHMValue(Map<Integer, Long> lhm, int index) {
    
    return ENTRIES.get(index).getValue();
}

public static Integer getLHMKey(Map<Integer, Long> lhm, int index) {

    return ENTRIES.get(index).getKey();
}

您可以引入一个代表当前索引的变量。

然后遍历条目,直到达到目标索引。

从目标条目返回键/值

public static Long getLHMValue(Map<Integer, Long> lhm, int index) {
    if (index < 0 || index >= lhm.size()) {
        throw new IllegalArgumentException();
    }
    
    int i = 0;
    Map.Entry<Integer, Long> result = null;
    for (Map.Entry<Integer, Long> entry: lhm.entrySet()) {
        if (i == index) result = entry;
        i++;
    }
    return result.getValue();
}

或者,您可以使用 Java 11 方法收集.to数组(集成函数

public static Long getLHMValue(Map<Integer, Long> lhm, int index) {

    return lhm.values().toArray(Long[]::new)[index]; // or lhm.values().toArray(new Long[0])[index];
}

闻人升
2023-03-14

getLHMValue中,问题是您的数组创建:

Integer[] keyArray = valueSet.toArray(new Integer[valueSet.size()]);

因为value eSetSet

Collection<Long> valueSet = lhm.values();

但现在您遇到了一个问题,Collection无法确保任何订单。

Btw:你的值是< code>Long所以你也应该返回< code>Long

 类似资料:
  • 我有两个数组:和。 数组中的示例值:。 数组中的值示例:。 我需要创建一个JavaScript对象,将数组中的所有项放在同一个对象中。例如

  • 问题内容: 我试图传递包含键和值的数组。 键是列,值是要选择的值。 我试图编写一个函数,可以传递数组并将键和值用作表的列和值。例如: 我需要这样创建sql语句: 问题答案: 您可以构建一个简单的SQL Select,如下所示:

  • 问题内容: 我试图从bash中的字符串创建一个json对象。字符串如下。 输出来自docker stats命令,我的最终目标是将自定义指标发布到AWS CloudWatch。我想将此字符串格式化为json。 我以前使用过jq命令,似乎在这种情况下应该可以正常工作,但是我还没有能够提出一个好的解决方案。除了使用sed或awk对变量名进行硬编码和索引编制以外。然后从头开始创建一个json。任何建议,将

  • 问题内容: 我试图从bash中的字符串创建一个json对象。字符串如下。 输出来自docker stats命令,我的最终目标是将自定义指标发布到AWS CloudWatch。我想将此字符串格式化为json。 我以前使用过jq命令,似乎在这种情况下应该可以正常工作,但是我还没有想出一个好的解决方案。除了使用sed或awk对变量名进行硬编码和索引编制之外。然后从头开始创建一个json。任何建议,将不胜

  • 问题内容: 假设我有一个数组,像这样: 如何从数组中选取键并使其成为自己的变量?例如,该数组将变为: 我问这个问题是因为我正在创建一个MVC框架来帮助我的OOP,并且我希望用户将变量传递给View加载函数,这将允许用户在模板中使用变量,而不必知道数组是什么。被称为。 例如: view.php: 输出: 我的博客! 问题答案: http://php.net/manual/zh/function.ex

  • 问题内容: 在Python中,可以向1构造函数传递一系列键值对: 除了为此目的定义我自己的函数外,我想不出其他任何方法来在JavaScript中执行此类操作: 但是我是JS新手…这种对对对象转换是否内置任何内容? 1出于这个问题的目的,我将Python字典视为JS对象的Python副本,尽管当然相似性仅限于它们都是键值集合这一事实。 问题答案: 在撰写本文时(2013年),JavaScript对象