英文:
Java HashMap - Optimized way of appending a new value to a vector which is a value in a HashMap<String, Vector<String>>
问题
类似于在C++中向向量追加新元素的方法:-
myHashMap[myKey].push_back(newElement); //直接将newElement添加到值向量中
在Java中我能想到的唯一方法是从哈希映射中获取向量。将新字符串追加到向量中,然后再使用新向量设置键。
myValue = myHashMap.get(myKey);
/**检查键是否存在
**/
//如果存在
myValue.add(newElement);
myHashmap.put(myKey, myValue);
第二种方法与前一种方法一样快吗?如果不是,还有其他方法吗?谢谢
英文:
A similar way to appending new element to a vector like in C++ :-
myHashMap[myKey].push_back(newElement); //push newElement to the value vector directly
The only way i can think of in Java is to get the vector from hashmap. Append the new string to the vector and then set the key again with the new vector.
myValue = myHashMap.get(myKey);
/**Check if the key exists
**/
//If exists
myValue.add(newElement);
myHashmap.put(myKey, myValue);
Is the second approach as fast as the previous and if not is there any other approach? Thanks
答案1
得分: 4
不必将向量重新放入映射中,因为在向其添加内容时已经在修改该向量。
myHashMap[myKey].push_back(newElement);
可以通过以下方式实现:
myHashMap.get(myKey)
.add(newElement);
(假设 myHashMap.get(myKey)
不会返回 null)。
您可以在 Map 接口中使用 computeIfAbsent
来为首次处理的键构造向量对象。这更加优雅,不需要 if 块。
myHashMap.computeIfAbsent(key, k -> new Vector<>())
.add(newElement);
该函数 (k -> new Vector<>())
) 仅在 myHashMap
对于键 key
没有映射时才会执行。这样做的好处是它返回 key
的向量值,因此我们可以在其上链接 add
调用。
英文:
You do not have to put back the vector back in the map as you are already modifying the vector when adding to it.
myHashMap[myKey].push_back(newElement);
is achieved by
myHashMap.get(myKey)
.add(newElement);
(assuming myHashMap.get(myKey)
does not return a null).
You can use computeIfAbsent
in the Map interface to construct a vector object for a key processed for the first time. This is more elegant and does not require a if block.
myHashMap.computeIfAbsent(key, k -> new Vector<>())
.add(newElement);
The function (k -> new Vector<>()
) is only executed if the myHashMap
does not have a mapping for the key key
. The nice thing about this is it returns the vector value of key
so that we can chain the add
call on it.
答案2
得分: 2
首先,如果您关心Java中的性能,应该使用ArrayList
而不是Vector
。正如javadoc所说:
> 从Java 2平台v1.2开始,[Vector
]被改装为实现List
接口,使其成为Java Collections Framework的成员。与新的集合实现不同,Vector
是同步的。如果不需要线程安全的实现,建议使用ArrayList
来替代Vector
。
所以,假设我们正在使用Java 8(和ArrayList
),对于C++代码有两个翻译版本。
版本#1。适用于Java 5+
HashMap<String, ArrayList<String>> myMap = new HashMap<>();
...
ArrayList<String> list = myMap.get(myKey);
if (list == null) {
list = new ArrayList<>();
myMap.put(myKey, list);
}
list.add(newElement);
版本#2。适用于Java 8+
HashMap<String, ArrayList<String>> myMap = new HashMap<>();
...
myMap.computeIfAbsent(key, k -> ArrayList<>()).add(newElement);
哪个更快?您需要进行测试以确保,但我认为第二个版本应该会稍微快一些,因为它避免了在put
调用中的第二次哈希映射查找。
而且,一行代码比六行代码更整洁。(对于可读性可能有所不同。这取决于阅读代码的人,以及他们对Java 8+语言特性和API的熟悉程度。)
英文:
Firstly, if you care about performance in Java, use ArrayList
instead of Vector
. As the javadoc says:
> As of the Java 2 platform v1.2, [Vector
] was retrofitted to implement the List
interface, making it a member of the Java Collections Framework. Unlike the new collection implementations, Vector
is synchronized. If a thread-safe implementation is not needed, it is recommended to use ArrayList
in place of Vector
.
So, assuming we are using Java 8 (and ArrayList
), there are two translations for the C++ code.
Version #1. Works for Java 5+
HashMap<String, ArrayList<String>> myMap = new HashMap<>();
...
ArrayList<String> list = myMap.get(myKey);
if (list == null) {
list = new ArrayList<>();
myMap.put(myKey, list);
}
list.add(newElement);
Version #2. Works for Java 8+
HashMap<String, ArrayList<String>> myMap = new HashMap<>();
...
myMap.computeIfAbsent(key, k -> ArrayList<>()).add(newElement);
Which will be faster? You would need to test it to be sure, but I think that the second version should be a bit faster because it avoids the second hashmap lookup in the put
call.
And 1 line of code is neater than 6 lines. (YMMV for readability. It depends on the person reading the code, and how familiar they are with Java 8+ language features and APIs.)
答案3
得分: 1
你可以用相同的方式在Java中实现这个功能。
myHashMap.get(key).add(newValue)
因为在哈希映射中,列表(或者你可以称之为向量)的引用被存储为值。所以修改列表的内容不会影响引用。你可以将这个引用想象成C++中向量的64位地址。
英文:
You can do this in the same way in java.
myHashMap.get(key).add(newValue)
Because in the hashmap the reference of list (or you can say it vector) is stored as value. So modifying the content of List will not influence the reference. You can imagine this reference likes 64bits address of a vector in c++.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论