我正在开发一个Java类,它从“帐户请求”表单中获取参数(如“名字”,“姓氏”,“电子邮件”等)。
Java类首先从表单中获取参数。然后使用第一个和最后一个名称字符串初始化用户名,如下所示:
String userName = firstName.substring(0,1).toLowerCase() + lastName.toLowerCase();
例如,“Jake Smith”的用户名是jsmith。
之后,它会检查数据库中是否存在“userName”。显然,“杰克史密斯”和“约翰史密斯”会创建相同的用户名,“jsmith”。为了解释这一点,我只想将从1开始的数字附加到任何匹配的用户名。
如何在每个冲突的用户名末尾附加一个唯一的数字(从1开始,每增加一次冲突加1)?
显然,更优雅的解决方案是允许用户指定用户名,但这就是模拟客户端希望项目完成的方式。
谢谢!
答案 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
最后没有数字。