我有这样一个字符串:
// string1
horse|cow|goat|zebra|
和另一个像这样的字符串:
// string2
horse:a,pig:b,cow:z,monkey:g,goat:a,
我的目标是拆分 string1,然后找出它在 string2 中出现的任何地方,以构建直方图。我目前正在这样做:
var histogram = {};
var animals = string1.split("|");
for (var i = 0; i < animals.length; i++) {
var animal = animals[i];
var animalColon = animal + ":";
var index = string2.indexOf(animalColon);
while (index != -1) {
var indexColon = index + animalColon.length;
var indexFinal = string2.indexOf(",", indexColon);
var letter = string2.substring(indexColon, indexFinal);
if (histogram[letter] == null) {
histogram[letter] = 1;
}
else {
histogram[letter] = histogram[letter] + 1;
}
index = string2.indexOf(animalColon, index + 1);
}
}
最后,它可能会打印出如下内容:
// histogram:
a: 2 instances // from { horse, goat }
z: 1 instance // from { cow }
上面的方法可行,但我必须 dp animals.length 通过 string2 来检查每个人。
有没有一种方法可以使用正则表达式来进行这种解析——本质上是并行运行所有测试,而不是进行多次传递?由于 string2 是 const,似乎所有检查都可以同时完成(不确定是否正则表达式是这样实现的)。
我将 string1 和 string2 中的元素数量增加了数千个元素,它仍然运行得相当快,但我担心机器速度较慢、可维护性等问题,
谢谢
最佳答案
我将从预处理您的 string2 开始,您说它是常量。使用一个对象比继续在字符串中搜索要好:
var s = "horse:a,pig:b,cow:z,monkey:g,goat:a";
var hash = {};
var tokens = s.split(',');
for(var i=0;i<tokens.length;i++){
var a = tokens[i].split(':');
hash[a[0]] = a[1];
}
下一步,当你得到字符串时,你可以更容易地查找字母(你可能还想检查 if(letter)
,如果你在 string1 中得到一个新的动物
):
var histogram = {};
var string1 = "horse|cow|goat|zebra";
var animals = string1.split("|");
for(var i=0;i<animals.length;i++){
var letter = hash[animals[i]];
if (!histogram[letter])
histogram[letter] = 0;
histogram[letter]++;
}
根据你的问题,你可能会滥用正则表达式来计算字母,但它不是平行的,但充其量是线性的,而且可能足够复杂而不值得。
关于javascript - 使用正则表达式可能会提高字符串解析的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3437772/