-1

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

例子:

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

输入“贾斯汀”

返回:“Justin4”,因为 Justin 和 Justin 的数字 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.
    }
}
4

9 回答 9

2

这一行:

if(existingNames[i] == (newName)){

应该成为

if(existingNames[i].equals(newName)){

通常,在 Java 中始终使用equals而不是==for 字符串。

于 2013-08-15T19:24:11.227 回答
1

我会改变你的方法。我认为最好使用Map<String, Integer>. 例如,使用"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;    
}

哦,在比较字符串时使用.equals()而不是:)==

于 2013-08-15T19:24:01.053 回答
0

使用==with 字符串比较引用,而不是底层对象。使用str.equals().

于 2013-08-15T19:26:04.137 回答
0

我猜你的应用程序中有一个函数可以回答用户名是否已经存在,我称之为usernameExists(String username)返回trueor 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);
}
于 2013-08-15T19:31:38.737 回答
0

您没有正确比较字符串,而是将整数 1 添加到字符串中。比较字符串是用 .equals 完成的。为了将整数连接到字符串的末尾:

static Integer j=0;

return newMember(existingNames, newName + j.toString());
于 2013-08-15T19:21:56.027 回答
0

在 Java 中比较字符串时,通常应该使用equals()方法。

于 2013-08-15T19:22:46.643 回答
0

*永远不要将字符串的相等性与==. 使用equals()*

于 2013-08-15T19:23:15.040 回答
0

用于.equals比较 Java 中的字符串,而不是==.

==将确定字符串引用是否相同,而它们几乎肯定不会相同。(在极少数情况下可能是由于实习生池。)

.equals将确定字符串的内容是否相同。

于 2013-08-15T19:23:51.007 回答
-1

在 SQL 中执行此操作要容易得多:

select ... where ... LIKE username%
于 2013-08-15T19:23:18.747 回答