我的输入是一个字符串,它可能是个人的名字,姓氏,组合,甚至是特定顺序的一部分
Class {
first = 'John' // just simple string
last = 'Smith' // just simple string
middle = 'Mark Bill' // this is often empty string, but may contain multiple, divided by spaces. ('' or 'Mark Bill')
hasPresent(what){
return true || false
}
}
如果用户的输入是'John',我们John的hasPresent
方法应该返回true
其他情况:
"input" => expected result
"Smith" => true
"mark" => true
"John Mark" => true
"hn mar" => true
"m" => true
" " => true
"John John" => false
"John Mark John" => false
"Jo Mark" => false
"John rk" => false
"n n n" => false
为了更好地理解,想象一下,只要您只使用一次,就可以按任何顺序订购此人的姓名。然后输入并与˙indexOf˙函数匹配。也就是说,为什么˙“John rk”˙是假的,你尝试的一切都很难,你可以按照这个特定的顺序组合一个有“˙”john rk“˙的字符串。你可以有˙“John Mark”˙,但这与˙indexOf˙不相符。
从我们的名字,我们可以匹配任何匹配任何下面的字符串
"John Smith Mark Bill","John Mark Smith Bill","John Bill Smith Mark","John Mark Smith Bill","John Smith Bill Mark", "John Mark Bill Smith" etc
我认为,使用所有名称(第一个,最后一个和分隔的中间名称)创建数组并匹配所有可能的组合可能是要走的路,但由于必须在此之前完成,我想知道是否有更好的方式。
如果没有更好的方法,如何以尽可能小的处理能力从阵列中制作所有可能的组合?
答案 0 :(得分:2)
您可以concat
所有名称,并且对于用户输入的每个单词,检查字符串中是否存在。
first = 'John';
last = 'Smith';
middle = 'Mark Bill';
searchStr = first + " " + middle + " " + last;
function hasPresent(param){
searchLower = searchStr.toLowerCase();
searchWords = param.toLowerCase().split(" ");
for (i = 0; i < searchWords.length; i++){
index = searchLower.indexOf(searchWords[i])
if (index == -1){
return false;
}
searchLower = searchLower.substring(0,index) + searchLower.substring(index + searchWords[i].length, searchLower.length);
}
return true;
}
对于您的示例,以及&#34; Joh Smi&#34;等示例,这将返回true,但区分大小写。如果需要,您可以对其进行调整以使其不区分大小写。
答案 1 :(得分:0)
如果你有一个完整的字符串,你可以检查if ($q='Admin')
{
,如果它不是-1,你知道字符串包含单词。如果你想将数组转换为这个长字符串,只需执行类似
int indexOf(String str)
然后检查
for (int i = 0; i < strArray.length; i++)
{
someStr += strArray[i];
}
答案 2 :(得分:0)
修改,更新
就像在
上做indexOf
一样
var fullname = "John Mark Bill Smith";
var checkname = fullname.toLowerCase().indexOf(input.toLowerCase()) !== -1;
var fullname = "John Mark Bill Smith";
var check = function(input) {
return fullname.toLowerCase().indexOf(input.toLowerCase()) !== -1
}
console.log(check("Smith")
, check("mark")
, check("John Mark")
, check("hn mar")
, check("m")
, check(" ")
, check("John John")
, check("John Mark John")
, check("Jo Mark")
, check("John rk")
, check("n n n")
)
&#13;
答案 3 :(得分:-2)
这是一种美丽。我的订单周期尽可能少。
hasPresent(what:string|number):boolean {
if(isNumber(what)){
return this.tel.hasPresent(what)
}else{
if (this.tel.hasPresent(what)) {
return true
}else{
var query = what.toString().toLowerCase().split(' ')
var possible = this.name.toLowerCase().trim().split(' ')
if(query.length > possible.length){
return false // No way this could be met
}
for (var i = possible.length - 1; i > 0; i--) {
var possible2 = this.name.toLowerCase().trim().split(' ')
if(possible[i].hasPresent(query[0])){
if (query.length==1){
return true
}
possible2.remove(possible[i])
for (var j = 1; j < query.length; j++){
var passed = false
for (var k = possible2.length - 1; k > 0; k--) {
if(possible2[k].indexOf(query[j]) == 0){
possible2.remove(possible2[k])
passed = true
break
}
}
if(!passed){
break
}
}
if(passed){
return true
}
}
}
return false
}
}
}
旁注:
Array.remove(object) - removes object for array
Array|String.hasPresent(needle) - shortcut for indexOf(needle) => 0