Java 使用递归与用户名匹配
我正在为用户名数据库实现一个字符串匹配算法。我的方法使用现有的用户名数据库和用户想要的新用户名,并检查用户名是否被使用。如果采用该方法,则该方法应返回用户名,其中包含数据库中未采用的数字 例如: “贾斯汀”、“贾斯汀1”、“贾斯汀2”、“贾斯汀3” 输入“Justin” 返回:“Justin4” 因为贾斯汀和贾斯汀的数字从1到3已经被录取了 在下面的代码示例中,Java 使用递归与用户名匹配,java,string,recursion,matching,Java,String,Recursion,Matching,我正在为用户名数据库实现一个字符串匹配算法。我的方法使用现有的用户名数据库和用户想要的新用户名,并检查用户名是否被使用。如果采用该方法,则该方法应返回用户名,其中包含数据库中未采用的数字 例如: “贾斯汀”、“贾斯汀1”、“贾斯汀2”、“贾斯汀3” 输入“Justin” 返回:“Justin4” 因为贾斯汀和贾斯汀的数字从1到3已经被录取了 在下面的代码示例中,newMember返回Justin1,即使它已经存在——错误在哪里 public class UserName { stati
newMember
返回Justin1,即使它已经存在——错误在哪里
public class UserName {
static int j = 0;
static String newMember(String[] existingNames, String newName){
boolean match = false;
for(int i = 0; i < existingNames.length; i++){
if(existingNames[i] == (newName)){
match = true;
}
}
if(match){
j++;
return newMember(existingNames, newName + j);
}
else{
return newName;
}
}
public static void main(String[] args){
String[] userNames = new String[9];
userNames[0] = "Justin1";
userNames[1] = "Justin2";
userNames[2] = "Justin3";
userNames[3] = "Justin";
System.out.println(newMember(userNames, "Justin"));
// I don't understand why it returns Justin1 when the name is already taken
// in the array.
}
}
公共类用户名{
静态int j=0;
静态字符串newMember(字符串[]现有名称,字符串newName){
布尔匹配=假;
for(int i=0;i
您没有正确比较字符串,而是将整数1添加到字符串中。比较字符串是使用.equals完成的。要将整数连接到字符串的末尾,请执行以下操作:
static Integer j=0;
return newMember(existingNames, newName + j.toString());
在Java中比较字符串时,通常应使用方法进行比较。*永远不要将字符串的相等性与
=
进行比较。使用equals()
select ... where ... LIKE username%
使用.equals
比较Java中的字符串,而不是=
=
将确定字符串引用是否与几乎肯定不相同的字符串引用相同。(极少数情况下可能是由于实习生人才库造成的。)
.equals
将确定字符串的内容是否相同。。我认为最好使用地图
。例如,“Justin”
-“Justin3”
作为用户名的事实可以通过地图表示:
{"Justin": 3}
要检查是否使用了用户名,请检查它是否是地图中的密钥。要获取特定用户名的“下一个”用户名,请从映射中获取与该名称对应的值并添加1。大概是这样的:
static String newMember(Map<String, Integer> existingNames, String newName) {
if (existingNames.containsKey(newName)) {
int newNum = existingNames.get(newName) + 1;
existingNames.put(newName, newNum);
return newName + newNum;
}
existingNames.put(newName, 0);
return newName;
}
静态字符串newMember(映射现有名称、字符串newName){
if(existingNames.containsKey(newName)){
int newNum=existingNames.get(newName)+1;
existingNames.put(newName,newNum);
返回newName+newNum;
}
现有名称。put(新名称,0);
返回newName;
}
哦,在比较字符串时使用.equals()
而不是=
)这行:
if(existingNames[i] == (newName)){
应该成为
if(existingNames[i].equals(newName)){
通常,在Java中,对字符串始终使用equals
而不是=
。对字符串使用=
比较引用,而不是底层对象。使用str.equals()
我想你的应用程序中有一个函数在回答如果用户名已经存在,我称这个usernameExists(字符串用户名)
返回true
或false
String getOkUsername (String wantedUsername) {
//if it's free, return it!
if(!usernameExists(wantedUsername)) {
return wantedUsername;
};
//OK, already taken, check for next available username
int i=1;
while(usernameExists(wantedUsername+Integer.toString(i))) {
i++;}
return wantedUsername + Integer.toString(i);
}
你犯了同样的老错误,已经解决了上千次了。为什么要使用递归呢?@Ruchira-its在他的代码中。为了将来的参考,请在你的文章中加入代码之外的问题,OP。第一件事是,请正确缩进你的代码以便阅读。@boxed\u l你是什么意思?你不是将justin4
拆分为justin(key):4(value)
?@boxed\u l不是真的:地图包含用户名:max\u数字对,其中max_number是迄今为止附加到该用户名的最大数字。这是一种非常有趣的方法,我将尝试这种方法。但是你不是想在If语句之后放一个else语句吗?@user2510809否,因为在If
-子句的末尾有一个return
。我使用了Equals,但得到了一个空指针异常。我不明白是什么导致空指针exception@user2510809数组的长度为9,但只填充了4个值。尝试将数组的长度更改为4?@user2510809,或者根本不使用数组,而是使用列表。@arshajii是的,这会更好,只是尝试解决眼前的问题:)应该使用.equalsIgnoreCase()