将整数附加到用户名结尾的最佳方法?

时间:2012-08-09 19:52:59

标签: java

我正在开发一个Java类,它从“帐户请求”表单中获取参数(如“名字”,“姓氏”,“电子邮件”等)。

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

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

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

之后,它会检查数据库中是否存在“userName”。显然,“杰克史密斯”和“约翰史密斯”会创建相同的用户名,“jsmith”。为了解释这一点,我只想将从1开始的数字附加到任何匹配的用户名。

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

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

谢谢!

5 个答案:

答案 0 :(得分:3)

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

String.format("%s%d", username, i++);

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

使用StringBuilder构建新字符串,使用StringBuilder#toString来获取它。

答案 3 :(得分: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);
    }
}

答案 4 :(得分: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最后没有数字。