编写一个给定List和模式的函数返回匹配元素

时间:2016-07-09 01:32:33

标签: java string

驼峰案例列表: [' HelloMars',' HelloWorld',' HelloWorldMars',' HiHo']

测试用例:

  • H - > [HelloMars,HelloWorld,HelloWorldMars,HiHo]
  • HW - > [HelloWorld,HelloWorldMars]
  • Ho - > []
  • HeWorM - > [HelloWorldMars]

这是我尝试过的:

private static List<String> findMatchingCamel(String patter){
    List<String> result=new ArrayList<String>();
    List<String> myData=Arrays.asList("HelloMars","HelloWorld","HelloWorldMars","HiHo");

    String[] upperCasePattern=splitBasedOnUpperCaseLetter(patter);
    for(String str1:myData){
        boolean found=true;
        for(String s:upperCasePattern){
            if(str1.indexOf(s)==-1)
            {
                found=false;
                break;
            }
        }
        if(found)
            result.add(str1);
    }
    return result;
}

private static String[] splitBasedOnUpperCaseLetter(String str){
    String[] result=str.split("(?=[A-Z])");
    return result;
}

我的函数不处理案例,例如当模式是Ho时它正在返回HiHo。我怎样才能改善它;修复bug并尽可能在最短时间内返回结果?

2 个答案:

答案 0 :(得分:0)

您需要检查单词是否符合数据的顺序,所以

private static List<String> findMatchingCamel(String patter){
    List<String> result=new ArrayList<String>();
    // Split the data on UpperCase too
    List<String[]> myData=Arrays.asList(
        splitBasedOnUpperCaseLetter("HelloMars"),
        splitBasedOnUpperCaseLetter("HelloWorld"),
        splitBasedOnUpperCaseLetter("HelloWorldMars"),
        splitBasedOnUpperCaseLetter("HiHo")
    );

    String[] upperCasePattern = splitBasedOnUpperCaseLetter(patter);
    for(String[] str1:myData){
        boolean valid = true;
        if(upperCasePattern.length() <= str1.length())
            // For the UpperCase splits length
            for(int i=0; i<upperCasePattern.length(); i++){
                // If string do not match the start of the data
                if(!upperCasePattern[i].equals(str1[i].substring(0,upperCasePattern[i].length())){
                    // Go on the next data
                    valid = false;
                    break;
                }
            }
            if(valid)
                result.add(str1.toString());
        }
    }
    return result;
}

答案 1 :(得分:0)

在以下条件中,检查字符串

中是否存在模式
for(String s:upperCasePattern){
        if(str1.indexOf(s)==-1)
        {
            found=false;
            break;
        }
    }

但是模式应该按照给定的顺序给出。你可以做的是你可以分割myData中的每个字符串,类似于模式。然后尝试匹配两个字符串数组。如果模式存在于myData的分割字符串数组中,则与upperCasePattern具有相同的索引。代码可能如下所示:

for(String str1:myData){

    String[] upperCaseMyData = splitBasedOnUpperCaseLetter(str1);

    boolean found=true;int length = 0;

    if(upperCaseMyData.length<upperCasePatter.length)
    {
        length = upperCaseMyData.length;
    }
    else
    {
        length = upperCasePatter.length;
    }
    for(int i=0;i<length;i++)
    {
        if(upperCaseMyData[i].indexOf(upperCasePatter[i])==-1)
        {
            found=false;
            break;
        }
    }
    if(found)
        result.add(str1);
}