Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用递归与用户名匹配_Java_String_Recursion_Matching - Fatal编程技术网

Java 使用递归与用户名匹配

Java 使用递归与用户名匹配,java,string,recursion,matching,Java,String,Recursion,Matching,我正在为用户名数据库实现一个字符串匹配算法。我的方法使用现有的用户名数据库和用户想要的新用户名,并检查用户名是否被使用。如果采用该方法,则该方法应返回用户名,其中包含数据库中未采用的数字 例如: “贾斯汀”、“贾斯汀1”、“贾斯汀2”、“贾斯汀3” 输入“Justin” 返回:“Justin4” 因为贾斯汀和贾斯汀的数字从1到3已经被录取了 在下面的代码示例中,newMember返回Justin1,即使它已经存在——错误在哪里 public class UserName { stati

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

例如:

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

输入“Justin”

返回:“Justin4” 因为贾斯汀和贾斯汀的数字从1到3已经被录取了

在下面的代码示例中,
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()