我有这个代码,我无法理解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) 我想使用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.
有没有办法绕过这个?
谢谢您的帮助!
我需要一个将条目存储为键值对的集合(所以我可以通过键查找值),但是我需要一个允许多个值使用hibernate共享同一个键的集合
是否有相当于MultiMaps的漂亮MapMaker?目前我创建这样的缓存:
public static Map<Session,List<Person>> personCache = new MapMaker().weakKeys().makeMap();
Run Code Online (Sandbox Code Playgroud)
MultiMap的重点是避免嵌套的List值.有没有办法用弱键构造多图?
我不明白为什么在迭代这个时我得到一个ConcurrentModificationException multimap.我读了以下条目,但我不确定我是否理解了整个事情.我试图添加一个synchronized块.但我怀疑的是与什么同步,何时.
这multimap是一个字段,创建如下:
private Multimap<GenericEvent, Command> eventMultiMap =
Multimaps.synchronizedMultimap(HashMultimap.<GenericEvent, Command> create());
Run Code Online (Sandbox Code Playgroud)
并像这样使用:
eventMultiMap.put(event, command);
Run Code Online (Sandbox Code Playgroud)
并且像这样(我试图在地图上同步这部分,但没有成功)
for (Entry<GenericEvent, Command> entry : eventMultiMap.entries()) {
if (entry.getValue().equals(command)) {
eventMultiMap.remove(entry.getKey(), entry.getValue());
nbRemoved++;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试为每个键创建一个(基于散列的)Multimap,其中包含一个(基于散列的)Multiset值.看例子:
Multimap<Object, Object> mmap = Multimaps.newMultimap(
Maps.<Object, Collection<Object>>newHashMap(),
new Supplier<Collection<Object>>() {
public Collection<Object> get() {
return HashMultiset.create();
}
});
mmap.put("1", "2");
Run Code Online (Sandbox Code Playgroud)
但是之后,
System.out.println(mmap.get("1") instanceof Multiset<?>);
//false, the returned collection is not a HashMultiset,
//but a (private) WrappedCollection
Run Code Online (Sandbox Code Playgroud)
所以我似乎无法访问我创建的多重集?我希望能够将其作为Multiset(包含在Multisets.unmodifiableMultiset()中)返回.我不希望每次都将它复制到新的Multiset中.除了切换回Map<K, Multiset<V>>代码并添加我Multimap想要消除的复杂性之外,我还有其他选择吗?
我尝试用std :: priority_queue替换std :: multiset。但是我对速度结果感到失望。该算法的运行时间增加了50%...
以下是相应的命令:
top() = begin();
pop() = erase(knn.begin());
push() = insert();
Run Code Online (Sandbox Code Playgroud)
我对priority_queue实现的速度感到惊讶,我预期会有不同的结果(对于PQ更好)...从概念上讲,多集被用作优先级队列。为什么优先级队列和多重集即使在情况下也具有如此不同的性能-O2?
十个结果的平均值,MSVS 2010,Win XP,32位,方法findAllKNN2()(请参见下面的内容)
MS
N time [s]
100 000 0.5
1 000 000 8
PQ
N time [s]
100 000 0.8
1 000 000 12
Run Code Online (Sandbox Code Playgroud)
什么会导致这些结果?尚未对源代码进行其他更改...感谢您的帮助...
MS实施:
template <typename Point>
struct TKDNodePriority
{
KDNode <Point> *node;
typename Point::Type priority;
TKDNodePriority() : node ( NULL ), priority ( 0 ) {}
TKDNodePriority ( KDNode <Point> *node_, typename Point::Type priority_ ) : node ( …Run Code Online (Sandbox Code Playgroud) 我有一个std::unordered_multimap,我想获得特定键的最后插入元素.我观察到了这种行为:
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main() {
unordered_multimap<string, string> mmap;
mmap.emplace("a", "first");
mmap.emplace("a", "second");
mmap.emplace("a", "last");
mmap.emplace("b", "1");
mmap.emplace("b", "2");
mmap.emplace("b", "3");
auto last_a = mmap.equal_range("a").first;
auto last_b = mmap.equal_range("b").first;
cout << last_a->second << endl;
cout << last_b->second << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码输出:
last
3
Run Code Online (Sandbox Code Playgroud)
这至少是GCC,我想要的行为.我可以依靠吗?标准是否对std::unordered_multimap商店的订单说了什么?如果没有,最好的选择是什么?
我试图确定是否emplace_hint应该使用键插入一个键multimap(而不是常规键emplace).我已经计算了早期操作中键的范围(在同一个键上):
range = multimap.equal_range(key);
Run Code Online (Sandbox Code Playgroud)
我应该使用range.first,range.second或者没有任何提示来插入密钥,值对吗?如果范围是空的怎么办?
正如官方文档中所述,Android Room 数据库最好使用 Multimap 返回类型。
对于下一个非常简单的示例,它无法正常工作!
@Entity
data class User(@PrimaryKey(autoGenerate = true) val _id: Long = 0, val name: String)
@Entity
data class Book(@PrimaryKey(autoGenerate = true) val _id: Long = 0, val bookName: String, val userId: Long)
Run Code Online (Sandbox Code Playgroud)
(我相信很多开发人员的_id表中都有主键)
现在,在 Dao 类中:
@Query(
"SELECT * FROM user " +
"JOIN book ON user._id = book.userId"
)
fun allUserBooks(): Flow<Map<User, List<Book>>>
Run Code Online (Sandbox Code Playgroud)
虽然它应该有 2 个条目,因为相应的表中有 2 个用户。
附言。我目前使用的是最新的 Room 版本,版本 2.4.0-beta02。
multimap ×10
c++ ×4
java ×4
guava ×3
android-room ×1
c++11 ×1
collections ×1
concurrency ×1
gcc ×1
hibernate ×1
json ×1
multiset ×1
performance ×1
stl ×1