Go地图类型线程是否安全?我有一个程序,有许多goroutines读取和写入地图类型.如果我需要实施保护机制,那么最好的方法是什么?
我有一个字符串
def data = "session=234567893egshdjchasd&userId=12345673456&timeOut=1800000"
Run Code Online (Sandbox Code Playgroud)
我想将它转换为地图
["session", 234567893egshdjchasd]
["userId", 12345673456]
["timeout", 1800000]
Run Code Online (Sandbox Code Playgroud)
这是我现在这样做的方式,
def map = [:]
data.splitEachLine("&"){
it.each{ x ->
def object = x.split("=")
map.put(object[0], object[1])
}
}
Run Code Online (Sandbox Code Playgroud)
它有效,但是有更有效的方法吗?
鉴于这张地图
SortedMap<Integer, String> myMap = new TreeMap<Integer, String>();
Run Code Online (Sandbox Code Playgroud)
而不是for循环是否有一个实用功能来将前N个项目复制到目标地图?
假设您有两种文档类型,客户和订单.一个客户文档包含如姓名,地址等和基本信息的订单包含所有的订单信息每次客户订单的东西.存储文档时,type = order或type = customer.
如果我在一组10个客户和30个订单上执行地图功能,它将输出40行.有些行是客户,有些是订单.
问题是,如何编写reduce,以便将订单信息"填充"在具有客户信息的行内?因此它将返回10行(10个客户),但每个客户的所有相关订单.
基本上我不想在输出上单独记录,我想将它们组合在一起(订单分成一个客户行)我觉得减少是这样的吗?
如果我有一个像这样的结构
std::map<string, int> myMap;
myMap["banana"] = 1;
myMap["apple"] = 1;
myMap["orange"] = 1;
Run Code Online (Sandbox Code Playgroud)
如何访问myMap [0]?
我知道地图在内部进行排序,我对此很好,我希望通过索引在地图中获取值.我试过myMap [0]但是我得到了错误:
Error 1 error C2679: binary '[' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)
Run Code Online (Sandbox Code Playgroud)
我意识到我可以这样做:
string getKeyAtIndex (int index){
map<string, int>::const_iterator end = myMap.end();
int counter = 0;
for (map<string, int>::const_iterator it = myMap.begin(); it != end; ++it) {
counter++;
if (counter == index)
return it->first;
}
}
Run Code Online (Sandbox Code Playgroud)
但这肯定是非常低效的?有没有更好的办法?
让我们想象下面的不可变映射:
val foo = Map((10,"ten"), (100,"one hundred"))
Run Code Online (Sandbox Code Playgroud)
我想得到第一个元素的关键.
foo.head
得到第一个元素.但接下来呢?
我也想要这个元素的价值,即"十"
不得不说我大约两周前就开始学习Clojure了,现在我整整三天都遇到了问题.
我有一张这样的地图:
{
:agent1 {:name "Doe" :firstname "John" :state "a" :time "VZ" :team "X"}
:agent2 {:name "Don" :firstname "Silver" :state "a" :time "VZ" :team "X"}
:agent3 {:name "Kim" :firstname "Test" :state "B" :time "ZZ" :team "G"}
}
Run Code Online (Sandbox Code Playgroud)
并需要:team "X"
改为:team "H"
.我尝试了许多类似的东西assoc
,update-in
但没有任何作用.
我怎么能做我的东西?非常感谢!
当没有返回值时,.each()和.map()之间有什么区别吗?在这种情况下使用其中一个是否有任何好处?
myList.map(function(myModel, myIndex){
myModel.itemOne = itemOne;
myModel.itemTwo = itemTwo;
myModel.itemThree = itemThree;
});
myList.each(function(myModel, myIndex){
myModel.itemOne = itemOne;
myModel.itemTwo = itemTwo;
myModel.itemThree = itemThree;
});
Run Code Online (Sandbox Code Playgroud) 功能是:
[1,2,3].map( function (item)
{
console.log(item);
//return 'something';
});
Run Code Online (Sandbox Code Playgroud)
我的预期行为只有1作为输出,除非我取消注释
//return 'something'
Run Code Online (Sandbox Code Playgroud)
但我真的明白了
1
2
3
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么 ?
更新:
我正在使用nodejs进行测试.
我真的不明白.
var async = require("async");
[1,2,3].map( function (item)
{
console.log(item);
//return 'something';
});
async.map([1,2,3], function (item,callback)
{
console.log(item);
//callback(null,true)
}, function (err,result)
{
console.log(result);
}
);
Run Code Online (Sandbox Code Playgroud)
两者都返回相同
1
2
3
Run Code Online (Sandbox Code Playgroud)
而且我真的想等到我得到一个回复或回调,直到下一个项目被执行.
解决了
async.mapSeries([1,2,3], function (item,callback)
{
console.log(item);
//callback(null,true)
}, function (err,result)
{
console.log(result);
}
);
Run Code Online (Sandbox Code Playgroud)
是这样做的方式.