我有一个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 ()]);. 有什么想法吗?
问题是entrySet首先需要有一个Map.Entry
s数组。为这两种方法保留这样的数组会更快。
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);
}
首先,最好选择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];
}
在getLHMValue
中,问题是您的数组创建:
Integer[] keyArray = valueSet.toArray(new Integer[valueSet.size()]);
因为value eSet
是Set
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对象