2012-08-09 55 views
-1

我正在從一個「帳戶請求」表單(如'名字','姓','電子郵件'等)獲取參數的Java類。追加整數到用戶名結尾的最佳方式?

Java類首先從表單中獲取參數。然後初始化一個用戶名與姓和名的字符串,像這樣:

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

例如,對於「傑克·史密斯」的用戶名是jsmith的。

之後,它會檢查數據庫中是否存在'userName'。顯然,「傑克史密斯」和「約翰史密斯」將創建相同的用戶名稱,「jsmith」。爲了解決這個問題,我只想從1開始追加數字到任何匹配的用戶名。

如何在每個衝突用戶名的末尾追加一個唯一的數字(從1開始,每增加一次衝突就增加1)?

很明顯,更優雅的解決方案是允許用戶指定他們的用戶名,但這是模擬客戶端希望完成項目的方式。

謝謝!

回答

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沒有最終數字。

+0

這完美的工作。你爲什麼認爲這是一個愚蠢的解決方案?我喜歡這種方法,因爲它取代了整個字符串,而不是每次都追加一個數字(即user4而不是user1234)。 – TimeBomb006 2012-08-10 14:08:39

+0

哈哈!因爲如果'lastName'以數字結尾(出於某種瘋狂的原因),並且可能涉及大量字符串更改的操作應該使用另一個類如'StringBuilder'來獲得更好的性能,則它無法正常工作。 – elias 2012-08-10 14:39:36

+0

我明白了。那麼,在這種情況下,這應該不成問題!不會有任何數字,表現也不會是一個大問題,因爲不應該有太多的衝突。謝謝。 – TimeBomb006 2012-08-10 14:58:56

1

如果衝突是不可能的,那麼你可以只是循環,直到獨特,在1盯着每一次 加入1例如:

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

如果衝突有可能,那麼你可能會發現這種做法不能令人滿意,因爲表現點擊數據庫的懲罰(檢查是否唯一)用於循環的每次迭代。例如,如果你已經有jsmith100,那麼在提出jsmith101之前你不想檢查100次。

3

你可以使用String.format,像:

String.format("%s%d", username, i++); 
+2

+1,遠比'StringBuilder'方法冗長。 – mre 2012-08-09 20:01:07

1

下面是一個使用地圖跟蹤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); 
    } 
} 
+1

爲了這是有用的UniqueUsrname.ids將需要在啓動時從數據庫初始化 - 假設數據持續超出程序的第一次執行 – 2012-08-09 20:11:28