0

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

例子:

“贾斯汀”、“贾斯汀 1”、“贾斯汀 2”、“贾斯汀 3”

输入“贾斯汀”

返回:“Justin4”,因为 Justin 和 Justin 的数字 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

4 回答 4

1

您需要在每次循环迭代开始时重置match为。否则,它将匹配较早的数字,并在其余的迭代中停留在 true 上。你永远不会看到它不匹配更大的.falsexmatchxx

当你找到一个名字时,你也应该跳出x循环,否则你会继续otherName用更大的x.

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

于 2013-08-16T19:54:43.040 回答
0

你永远不会重置你的match变量。因此,如果它true在第一次运行时设置为,则永远不会false再次设置为,也if(!match) otherName = newName + x;永远不会发生。改变这个

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

match = existingNames[i].equals(newName + x);
于 2013-08-16T19:53:36.560 回答
0

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

于 2013-08-16T19:59:20.227 回答
0

一旦你有了 newName,你还需要在 if(found) 中打破外部 for 循环,同时将布尔值重置为 false

或者它只会连接到一个很长的用户名。

于 2013-08-16T20:05:42.397 回答