用第一次出现的索引替换文本中的单词
Replace words in a text with index of first occurrence
我必须创建一个程序,可以接受
这样的句子
my arms are red, my legs are red and I am red
并输出句子中单词第一次出现的索引,因此该句子的期望输出为
12341634910114
我不知道该怎么做。
谢谢
想法是这样的:
你必须把句子分解成单词。断点可以是 SPACE、COMMA、NEW LINE 等等
您可以创建 2 个数组。第一个包含所有单词,第二个仅包含唯一单词。
运行 两个数组通过循环将它们与第一次出现的单词进行比较并保存其索引
这是一种方法。
- 我以为你不想要标点符号,所以我删除了它们。
- 然后我创建了一个出现
key=word
和 value=first
的地图。
- 之后我遍历句子并用索引替换每个单词。
var text = "my arms are red, my legs are red and i am red";
// remove punctuation
text = text.replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g,"");
// split text
var words = text.split(" ");
// create map of word and first index
var m = new Map();
var i = 1;
words.forEach(function(word) {
// first occurrence?
if (m.get(word) == undefined) {
m.set(word, i++);
}
});
// replace words with index
var l = [];
words.forEach(function(word) {
l.push(m.get(word));
});
console.log(l.join(""));
肯定有更短的方法来做到这一点,但我认为这更容易阅读和理解
你的问题有误。如果一个词重复,索引应该被填充。
所以索引应该是
12341634910114 (123416349,10,11,4)
var str="my arms are red, my legs are red and i am red";
var words=str.replace(",","").split(" ");
var occur=[];
var pos=[];
//console.log(words.length);
for(var i=0; i< words.length; i++){
if(occur.length==0){
occur.push([words[i],i]);
pos.push(pos.length+1);
}
else{
for(var j=0; j<occur.length; j++){
if(words[i]==occur[j][0]){
pos.push(occur[j][1]+1);
break;
}
}
if(j>=occur.length){ // the loop is not broken
occur.push([words[i],i]);
pos.push(i+1);
}
}
}
console.log(pos.join(""));
//console.log(occur);
//console.log(occur[1][0]);
在单词边界拆分.match(/\b(\w+)\b/g)
使用 Array.map 将每个单词映射到出现次数。
通过使用 Array.slice
仅将数组切片到当前索引来查找出现次数,并在该切片数组上使用 Array.filter
查找出现次数。
同样的事情可以用很多不同的方式来完成,例如使用简单的循环。
var result = "my arms are red, my legs are red and i am red?".match(/\b(\w+)\b/g).map(function(currentValue, index, array){
return array.slice(0, index + 1).filter(x => x === currentValue).length;
}).join("");
console.log("result", result);
我必须创建一个程序,可以接受
这样的句子my arms are red, my legs are red and I am red
并输出句子中单词第一次出现的索引,因此该句子的期望输出为
12341634910114
我不知道该怎么做。
谢谢
想法是这样的:
你必须把句子分解成单词。断点可以是 SPACE、COMMA、NEW LINE 等等
您可以创建 2 个数组。第一个包含所有单词,第二个仅包含唯一单词。
运行 两个数组通过循环将它们与第一次出现的单词进行比较并保存其索引
这是一种方法。
- 我以为你不想要标点符号,所以我删除了它们。
- 然后我创建了一个出现
key=word
和value=first
的地图。 - 之后我遍历句子并用索引替换每个单词。
var text = "my arms are red, my legs are red and i am red";
// remove punctuation
text = text.replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g,"");
// split text
var words = text.split(" ");
// create map of word and first index
var m = new Map();
var i = 1;
words.forEach(function(word) {
// first occurrence?
if (m.get(word) == undefined) {
m.set(word, i++);
}
});
// replace words with index
var l = [];
words.forEach(function(word) {
l.push(m.get(word));
});
console.log(l.join(""));
肯定有更短的方法来做到这一点,但我认为这更容易阅读和理解
你的问题有误。如果一个词重复,索引应该被填充。 所以索引应该是 12341634910114 (123416349,10,11,4)
var str="my arms are red, my legs are red and i am red";
var words=str.replace(",","").split(" ");
var occur=[];
var pos=[];
//console.log(words.length);
for(var i=0; i< words.length; i++){
if(occur.length==0){
occur.push([words[i],i]);
pos.push(pos.length+1);
}
else{
for(var j=0; j<occur.length; j++){
if(words[i]==occur[j][0]){
pos.push(occur[j][1]+1);
break;
}
}
if(j>=occur.length){ // the loop is not broken
occur.push([words[i],i]);
pos.push(i+1);
}
}
}
console.log(pos.join(""));
//console.log(occur);
//console.log(occur[1][0]);
在单词边界拆分.match(/\b(\w+)\b/g)
使用 Array.map 将每个单词映射到出现次数。
通过使用 Array.slice
仅将数组切片到当前索引来查找出现次数,并在该切片数组上使用 Array.filter
查找出现次数。
同样的事情可以用很多不同的方式来完成,例如使用简单的循环。
var result = "my arms are red, my legs are red and i am red?".match(/\b(\w+)\b/g).map(function(currentValue, index, array){
return array.slice(0, index + 1).filter(x => x === currentValue).length;
}).join("");
console.log("result", result);