是什么区别HashMap
,LinkedHashMap
而TreeMap
在Java中?我没有看到输出有任何差异,因为所有三个都有keySet
和values
.什么是Hashtable
s?
Map m1 = new HashMap();
m1.put("map", "HashMap");
m1.put("schildt", "java2");
m1.put("mathew", "Hyden");
m1.put("schildt", "java2s");
print(m1.keySet());
print(m1.values());
SortedMap sm = new TreeMap();
sm.put("map", "TreeMap");
sm.put("schildt", "java2");
sm.put("mathew", "Hyden");
sm.put("schildt", "java2s");
print(sm.keySet());
print(sm.values());
LinkedHashMap lm = new LinkedHashMap();
lm.put("map", "LinkedHashMap");
lm.put("schildt", "java2");
lm.put("mathew", "Hyden");
lm.put("schildt", "java2s");
print(lm.keySet());
print(lm.values());
Run Code Online (Sandbox Code Playgroud) 将a转换Map<key,value>
为a 的最佳方法是List<value>
什么?只是迭代所有值并将它们插入列表中或者我忽略了什么?
我用谷歌搜索了这个并得到了不完整/矛盾的观点 - 在Ruby/Rails中对一个数组做一个map
和做一个实际上有什么区别collect
吗?
这些文档似乎没有任何暗示,但是方法或性能可能存在差异吗?
什么是决定不具有的接口完全通用的get方法背后的原因java.util.Map<K, V>
.
为了澄清这个问题,方法的签名是
V get(Object key)
代替
V get(K key)
我想知道为什么(同样的事情remove, containsKey, containsValue
).
确定STL映射是否包含给定键的值的最佳方法是什么?
#include <map>
using namespace std;
struct Bar
{
int i;
};
int main()
{
map<int, Bar> m;
Bar b = {0};
Bar b1 = {1};
m[0] = b;
m[1] = b1;
//Bar b2 = m[2];
map<int, Bar>::iterator iter = m.find(2);
Bar b3 = iter->second;
}
Run Code Online (Sandbox Code Playgroud)
在调试器中检查它,它看起来就像iter
垃圾数据.
如果我取消注释这一行:
Bar b2 = m[2]
Run Code Online (Sandbox Code Playgroud)
调试器显示的b2
是{i = 0}
.(我猜这意味着使用未定义的索引会返回一个包含所有空/未初始化值的结构?)
这些方法都不是很好.我真正喜欢的是这样的界面:
bool getValue(int key, Bar& out)
{
if (map contains value for key)
{
out = map[key];
return true; …
Run Code Online (Sandbox Code Playgroud) val map1 = Map(1 -> 9 , 2 -> 20)
val map2 = Map(1 -> 100, 3 -> 300)
Run Code Online (Sandbox Code Playgroud)
我想合并它们,并将相同键的值相加.结果将是:
Map(2->20, 1->109, 3->300)
Run Code Online (Sandbox Code Playgroud)
现在我有2个解决方案:
val list = map1.toList ++ map2.toList
val merged = list.groupBy ( _._1) .map { case (k,v) => k -> v.map(_._2).sum }
Run Code Online (Sandbox Code Playgroud)
和
val merged = (map1 /: map2) { case (map, (k,v)) =>
map + ( k -> (v + map.getOrElse(k, 0)) )
}
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更好的解决方案.
如何在迭代时从地图中删除?喜欢:
std::map<K, V> map;
for(auto i : map)
if(needs_removing(i))
// remove it from the map
Run Code Online (Sandbox Code Playgroud)
如果我使用map.erase
它将使迭代器无效
如果我有一个集合c
型的T
,有一个属性p
上T
(类型P
,说的),什么是做一个最好的办法地图通过提取键?
val c: Collection[T]
val m: Map[P, T]
Run Code Online (Sandbox Code Playgroud)
一种方法如下:
m = new HashMap[P, T]
c foreach { t => m add (t.getP, t) }
Run Code Online (Sandbox Code Playgroud)
但现在我需要一个可变的地图.有没有更好的方法来做到这一点,以便它在一行,我最终得到一个不可变的地图?(显然我可以将上面的内容变成一个简单的库实用程序,就像在Java中一样,但我怀疑在Scala中没有必要)