0

我正在研究一个从“帐户请求”表单(如“名字”、“姓氏”、“电子邮件”等)获取参数的 Java 类。

Java 类首先从表单中获取参数。然后它使用名字和姓氏字符串初始化用户名,如下所示:

    String userName = firstName.substring(0,1).toLowerCase() + lastName.toLowerCase();

例如,“Jake Smith”的用户名是 jsmith。

之后,它会检查数据库中是否存在此“用户名”。显然,“Jake Smith”和“John Smith”将创建相同的用户名“jsmith”。考虑到这一点,我只想将数字(从 1 开始)附加到任何匹配的用户名。

如何在每个冲突的用户名末尾附加一个唯一的数字(从 1 开始,每个额外的冲突增加 1)?

显然,一个更优雅的解决方案是允许用户指定他们的用户名,但这就是模拟客户端希望项目完成的方式。

谢谢!

4

5 回答 5

3

您可以使用String.format,例如:

String.format("%s%d", username, i++);
于 2012-08-09T20:00:37.953 回答
1

如果不太可能发生冲突,那么您可以循环直到唯一,每次都盯着 1 并添加 1 例如:

i=0;
String usernameToTry=username;
while (notUnique(usernameToTry)) {
    i++;
    usernameToTry=username+i;
}

如果可能发生冲突,那么您可能会发现这种方法不能令人满意,因为每次循环迭代都会访问数据库(检查是否唯一)的性能损失。例如,如果您已经有 jsmith100,那么在提出 jsmith101 之前,您不想检查 100 次。

于 2012-08-09T19:56:38.420 回答
1

使用 aStringBuilder构造新字符串并StringBuilder#toString获取它。

于 2012-08-09T19:57:09.990 回答
1

这是一个使用 Map 来跟踪 id 的简单方法。

class UniqueUsername {
    private static Map<String, Integer> ids = new HashMap<String, Integer>();

    public static String getUniqueUsername(String username) {
        if (!ids.containsKey(username)) {
            ids.put(username, new Integer(0));
            return username;
        }
        ids.put(username, ids.get(username)+1);
        return username + ids.get(username);
    }
}
于 2012-08-09T20:01:20.263 回答
1

一个“愚蠢”的解决方案,但如果它只是为了测试......

private String getUsername(){

    String userName = firstName.substring(0,1).toLowerCase() + lastName.toLowerCase();
    int i=1;
    while(usernameExists(userName)){
        userName = userName.replaceAll("\\d+$","") + i++;
    }
    return userName;
}

考虑到userName最后没有数字。

于 2012-08-09T20:05:15.357 回答