0

「アカウントリクエスト」フォーム(「名」、「姓」、「電子メール」など)からパラメーターを取得するJavaクラスに取り組んでいます。

Java クラスは、最初にフォームからパラメーターを取得します。次に、次のように姓と名の文字列でユーザー名を初期化します。

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

たとえば、「Jake Smith」のユーザー名は jsmith になります。

その後、この「userName」がデータベースに存在するかどうかを確認します。明らかに、「Jake Smith」と「John Smith」は同じユーザー名「jsmith」を作成します。これを考慮して、一致するユーザー名に 1 から始まる数字を追加したいと思います。

競合するすべてのユーザー名の最後に一意の番号を追加するにはどうすればよいですか (1 から始まり、競合が発生するたびに 1 ずつ増加します)。

明らかに、より洗練された解決策は、ユーザーがユーザー名を指定できるようにすることですが、これはモック クライアントがプロジェクトを完了する方法として望んでいる方法です。

ありがとうございました!

4

5 に答える 5

3

String.format次のようなものを使用できます。

String.format("%s%d", username, i++);
于 2012-08-09T20:00:37.953 に答える
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);
    }
}
于 2012-08-09T20:01:20.263 に答える
1

競合が発生する可能性が低い場合は、一意になるまでループして、1 を開始し、毎回 1 を追加することができます。次に例を示します。

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

競合が発生する可能性がある場合は、ループの反復ごとに (一意かどうかを確認するために) データベースにアクセスするというパフォーマンス上のペナルティがあるため、このアプローチでは満足できない場合があります。たとえば、すでに jsmith100 がある場合、jsmith101 を見つける前に 100 回チェックする必要はありません。

于 2012-08-09T19:56:38.420 に答える
1

a を使用しStringBuilderて新しい文字列を作成StringBuilder#toStringし、取得します。

于 2012-08-09T19:57:09.990 に答える
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最後に数字がないことを考慮してください。

于 2012-08-09T20:05:15.357 に答える