我想将HashMultiMap打印为json.
HashMultimap<String,Object> multimap = HashMultimap.create();
multimap.put("a",Obj1);
multimap.put("a",Obj3);
multimap.put("b",Obj2);
Run Code Online (Sandbox Code Playgroud)
至
{
"a":[Obj1,Obj3],
"b":[Obj2]
}
Run Code Online (Sandbox Code Playgroud)
Obj1和其他对象应该再次在json中(为了保持它清洁,我已经将它显示为对象)
我可以迭代各个键并使用诸如Gson之类的库将对象集转换为json.
但是要获取HashMultimap的整个快照,我想将其转换为json并检查它.
Gson无法转换整个地图,但可以做单个值(对象列表为json)
我正在查看关于multimap的MSDN文档,并发现它有一个成员函数multimap :: emplace().以下是该成员函数的示例.
int main( ) {
using namespace std;
multimap<int, string> m1;
pair<int, string> is1(1, "a");
m1.emplace(move(is1));
}
Run Code Online (Sandbox Code Playgroud)
看来,emplace()和move()是C++ 0x中.有人可以帮我解释一下吗?我读到了move(),但我真的不明白它做了什么(引擎盖下).
我正在寻找相应的方法,用于Multimap迭代a的条目Map,即:
Map<K,V> map = ...;
for (Map.Entry<K,V> entry : map.entrySet())
{
K k = entry.getKey();
V v = entry.getValue();
}
Run Code Online (Sandbox Code Playgroud)
以下哪项更好?(或者更重要的是,有什么区别?)
Multimap<K,V> mmap = ...;
for (Map.Entry<K,Collection<V>> entry : mmap.asMap().entrySet())
{
K k = entry.getKey();
Collection<V> v = entry.getValue();
}
Run Code Online (Sandbox Code Playgroud)
要么
Multimap<K,V> mmap = ...;
for (K k : mmap.keySet())
{
Collection<V> v = mmap.get(k);
}
Run Code Online (Sandbox Code Playgroud) 我有如下数据:
Key value
----- ------
car toyota
car bmw
car honda
fruit apple
fruit banana
computer acer
computer asus
computer ibm
...
Run Code Online (Sandbox Code Playgroud)
(上述数据中的每一行是一个对象与字段"键"和"值",都在一个列表List<DataObject>)
我想将数据构建成Map<String, List<String>>如下所示:
"car" : ["toyota", "bmw", "honda"]
"fruit" : ["apple","banana"]
"computer" : ["acer","asus","ibm"]
Run Code Online (Sandbox Code Playgroud)
如何Map从数据对象中实现上述结构?
******除了******
我更感兴趣的是使用纯JDK提供的类或接口来实现结果,而不是使用外部库.有帮助吗?
Multimap是一种将键映射到列表/值集的数据结构.
有没有一个好的,不显眼的js库来实现这个数据结构?
编辑 - 我知道我可以"轻松"自己实现它,但我相信将它作为一个独立的抽象是一件好事,所以这些问题的答案不应该"只是自己实现".
我正在写一个节点路径寻找算法.我需要在一定条件下运行多图并从中删除元素,但要继续迭代多图.下面是我的代码到目前为止,它似乎大部分时间都有效,但偶尔我在做nct_it ++时会出错.在递增迭代器之前从表中擦除迭代器指针是否安全?
std::list<SinkSourceNodeConn>::iterator it;
std::multimap<SysNode*, SysNode*>::iterator nct_it;
SysNode* found_node = NULL;
nct_it = node_conn_table.begin();
while(nct_it != node_conn_table.end()) {
// Find the node in the ever shrinking node connection table...
if(nct_it->first == parent_node)
found_node = nct_it->second;
// Remove the table entry if we have found a node
if(found_node) {
// Search for the node in the expanded list. If it's not found, add it.
bool found_the_node = false;
for(it = m_sink_source_nodes_.begin(); it != m_sink_source_nodes_.end(); it++) {
if(it->sink_source == sink_source && it->node …Run Code Online (Sandbox Code Playgroud) 在Scala我希望能够写
val petMap = ImmutableMultiMap(Alice->Cat, Bob->Dog, Alice->Hamster)
Run Code Online (Sandbox Code Playgroud)
底层Map [Owner,Set [Pet]]应该同时具有Map和Set不可变.这是ImmutibleMultiMap与伴随对象的初稿:
import collection.{mutable,immutable}
class ImmutableMultiMap[K,V] extends immutable.HashMap[K,immutable.Set[V]]
object ImmutableMultiMap {
def apply[K,V](pairs: Tuple2[K,V]*): ImmutableMultiMap[K,V] = {
var m = new mutable.HashMap[K,mutable.Set[V]] with mutable.MultiMap[K,V]
for ((k,v) <- pairs) m.addBinding(k,v)
// How do I return the ImmutableMultiMap[K,V] corresponding to m here?
}
}
Run Code Online (Sandbox Code Playgroud)
你能优雅地解决评论线吗?地图和集合都应该是不可变的.
谢谢!
我有这个代码,我无法理解equal_range方法返回迭代器的部分.我知道范围是配对对象里面有两个多图对象,但是我没有得到,这就是为什么'for (it = range.first; it != range.second; ++it)'- 这究竟是 什么意思?
// multmap.cpp -- use a multimap
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
typedef int KeyType;
typedef std::pair<const KeyType, std::string> Pair;
typedef std::multimap<KeyType, std::string> MapCode;
int main()
{
using namespace std;
MapCode codes;
codes.insert(Pair(415, "San Francisco"));
codes.insert(Pair(510, "Oakland"));
codes.insert(Pair(718, "Brooklyn"));
codes.insert(Pair(718, "Staten Island"));
codes.insert(Pair(415, "San Rafael"));
codes.insert(Pair(510, "Berkeley"));
cout << "Number of cities with area code 415: "
<< codes.count(415) << endl;
cout …Run Code Online (Sandbox Code Playgroud) 我有一个multimap(就像Guava提供的那样):
Multimap<K, V>
Run Code Online (Sandbox Code Playgroud)
这在逻辑上可以看作:
Map<K, Set<V>>
Run Code Online (Sandbox Code Playgroud)
我的multimap中的数据具有唯一键和唯一值.即,永远不会将相同的值分配给多个键.
除了维护两个Map结构之外,是否有人知道现有的class/api可能会让我通过键或值快速查找.
例如
Collection<V> get(K)
...and...
K getKeyByValue(V)
Run Code Online (Sandbox Code Playgroud)
顺便说一句,地图必须是可变的,即我的数据一直在变化.(对于不可变映射,Guava提供了一个ImmutableMultimap.inverse(),如果我的Map可以是不可变的,它将解决这个问题.)
任何帮助都会得到赞赏.
我想使用JSON序列化和反序列化MultiMap(Apache Commons 4).
要测试的代码片段:
MultiMap<String, String> map = new MultiValueMap<>();
map.put("Key 1", "Val 11");
map.put("Key 1", "Val 12");
map.put("Key 2", "Val 21");
map.put("Key 2", "Val 22");
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(map);
MultiMap<String, String> deserializedMap = mapper.readValue(jsonString, MultiValueMap.class);
Run Code Online (Sandbox Code Playgroud)
序列化工作正常,并产生我期望的格式:
{"Key 1":["Val 11","Val 12"],"Key 2":["Val 21","Val 22"]}
Run Code Online (Sandbox Code Playgroud)
不幸的是,反序列化产生的结果不是它看起来的样子:在反序列化之后,Multimap在ArrayList中包含一个用于键值的ArrayList,而不是包含值的键的单个ArrayList.
由于put()MultiMap实现了Map接口,因此调用多映射的方法来添加在json字符串中找到的数组,从而产生了这个结果.
如果将新值放入非现有键,MultiMap实现本身将再次创建一个ArrayList.
有没有办法绕过这个?
谢谢您的帮助!