使用String匹配alg返回null

时间:2013-08-16 19:48:58

标签: java string algorithm

正在为用户名数据库实现字符串匹配算法。我的方法采用现有的用户名数据库和该用户想要的新用户名,并检查是否采用了用户名。如果采用该方法,则该方法应返回带有未在数据库中获取的数字的用户名。

示例:

“Justin”,“Justin1”,“Justin2”,“Justin3”

输入“Justin”

返回:“Justin4”因为贾斯汀和贾斯汀的数字已经从1到3被采用。

在下面的代码示例中,newMember返回null,我不知道为什么。它应该返回“justin4”

public class UserName {

 static String newMember(String[] existingNames, String newName){
    boolean found = false;
    boolean match = false;
    String otherName = null;

    for(int i = 0; i < existingNames.length;i++){
        if(existingNames[i].equals(newName)){
            found = true;
            break;
        }

    }
    if(found){
        for(int x = 1; x < 100 ; x++){
            for(int i = 0; i < existingNames.length;i++){
                if(existingNames[i].equals(newName + x))
                    match = true;

            }
            if(!match)
                otherName = newName + x;
        }
                    // It returns NULL instead of "Justin4". Its as if otherName doesn't
                    // change after its initialization.
        return otherName;

    } else return newName;
}

public static void main(String[] args){

    String[] userNames = new String[4];
    userNames[0] = "Justin1";
    userNames[1] = "Justin2";
    userNames[2] = "Justin3";
    userNames[3] = "Justin";


    System.out.println( newMember(userNames, "Justin"));
    }
}

4 个答案:

答案 0 :(得分:1)

您需要在每次match循环迭代开始时将false重置为x。否则,它将匹配较早的数字,match将在其余的x次迭代中保持为true。你永远不会发现它与较大的x不匹配。

当你找到一个名字时,你也应该突破x循环,否则你会用更大的otherName覆盖x

您可能希望突破i循环(尽管您不需要)以提高效率;如果你已经知道有匹配,那就没有意义检查其余部分。

答案 1 :(得分:0)

您永远不会重置match变量。因此,如果在第一次运行中将其设置为true,则永远不会再将其设置为false,并且if(!match) otherName = newName + x;永远不会发生。改变这个

if(existingNames[i].equals(newName + x))
    match = true;

match = existingNames[i].equals(newName + x);

答案 2 :(得分:0)

我不知道区分大小写对您来说是否也很重要,在这种情况下,为了安全起见,您应该小心使用equalsIgnoreCase方法而不是equals。此外,如果您的用户名数据库是SQL数据库,我建议使用查询对数据库本身进行此检查,它应该更有效。 否则,请重置您的匹配变量。

答案 3 :(得分:0)

一旦你拥有newName,你还需要打破if(找到)中的外部for循环,以及将布尔值重置为false

或者它只会被连接到一个非常长的userName。