2014-01-16 15 views
0

首先:我是一名初學者,負責編寫學校作業。一位同學和我正在爲一位老師提供申請,他有一個關於物理學的網站。數組乘以一個或其他不工作

我們希望實現電子郵件地址+代碼的驗證。電子郵件的前6個字符在我的代碼中獲得數值* a var('sleutel')。我用一個方法getNumber來說:a = 1,b = 2,c = 3。我想將該字符串中的數字乘以一個和另一個。這就是輸入的代碼應該提前。

例如:當您輸入abc時,getNumber將其轉換爲123,乘以'sleutel'給我51015(1 * 5,2 * 5,3 * 5)。這是錯誤的地方:我想要以下內容:5 * 10 * 15。 但代碼給我:5 * 1 * 0 * 1 * 5(= 0 ...)。

有沒有一個(不同)的方式,我可以做到這一點?先謝謝你。

if (email_text.getText().length() > 0 
       && code_text.getText().length() > 0) { 
      final String userEmail = email_text.getText().toString() 
        .substring(0, Math.min(6, email_text.length())) 
        .toLowerCase(); 
      final String userCode = code_text.getText().toString(); 


      String validCode = ""; 
      int sleutel = 3; 
      for (int i = 0; i < userEmail.length(); i++) { 
       validCode += getNumber(userEmail.charAt(i)) * sleutel; 
      } 

      int res = 1; 
      for (char digits : validCode.toCharArray()) { 
       res *= (digits - '0'); 
      } 
      final String validCode2 = Integer.toString(res); 

      if (userCode.equals(validCode2)) { 
       Intent intent = new Intent(Login.this, Home.class); 
       startActivity(intent); 

      } else { // display toast} 

private int getNumber(Character c) { return "[email protected]".indexOf(c) +1; 

}

+0

當不可你只需將你的sleutel變量與getNumber方法返回的值相乘,而不是使用加法? –

+0

@MehmetSedatGüngör對不起,我一直在亂碼的代碼很長一段時間(看看有什麼工作),是的,它應該是*而不是。但是它不起作用! – YoranY

+0

你可以顯示getNumber方法的代碼嗎? –

回答

0

如果getNumber()地圖 'A' 爲1時, 'B' 爲2,..., '@' 至29,那麼可能的範圍內時通過sleutel相乘(3)將是3-87。 A String如「abck」將被映射到「12311」,並且乘以sleutel將變成「36933」。但即使代碼知道它是一個4位字符串,也無法知道它是如何分解的:

36933可能是3 * 6 * 9 * 33 = 5346(正確)或36 * 9 * 3 * 3 = 2916(不正確的)或3 * 69 * 3 * 3 = 1863(不正確的),等等

而不是存儲每個步驟作爲String的,這裏我做在一個for環一切:

if (email_text.getText().length() > 0 && code_text.getText().length() > 0) { 
    final String userEmail = email_text.getText().toString().substring(0, Math.min(6, email_text.length())).toLowerCase(); 
    final String userCode = code_text.getText().toString(); 

    int sleutel = 3; 
    long res = 1; 
    for(int i=0; i<userEmail.length(); i++) // loops through userEmail 
     res *= getNumber(userEmail.charAt(i)) * sleutel; // when the loop ends, res will have the correct value 

    if (userCode.equals(Long.toString(res))) { 
     Intent intent = new Intent(Login.this, Home.class); 
     startActivity(intent); 
    } else {...} // display toast 
} 
+0

謝謝!我已經認爲答案會是這樣的。但是...當userEmail> 6,validCode2的長度變爲零時。我怎樣才能解決這個問題?另外,有些電子郵件會給我負數。 – YoranY

+0

只是改變了我的方法,這很簡單,你甚至不需要任何數據結構來存儲中間步驟。一個'for'循環用於生成'res' – asaini007

+0

你得到負數的原因是因爲int具有最大值2,147,483,647(2^31 - 1)。例如,如果'userEmail'是「@@@@@@」,那麼'res'應該是(29 * 3)^ 6 = 433,626,201,009,超出了'int'的範圍。解決方法是改變你的算法,或者簡單地將res設置爲最大值爲2^63-1 = 9 *(10^18)的long,遠高於最大可能的「res」價值(來自「@@@@@@」的433,626,201,009) – asaini007

0

這以下的JavaSE應用程序做你需要什麼,你所提供的例子。

很容易使代碼適應您的Android應用程序。

您沒有清楚在電子郵件中應如何處理@_.字符。

public static void main(String[] args) { 
    System.out.println(generateCodeFromEmail("abc")); 
} 

public static String generateCodeFromEmail(String email) { 
    String emailSubstring = email.substring(0, Math.min(6, email.length())).toLowerCase(); 
    char[] chars = new char[emailSubstring.length()]; 
    email.getChars(0, emailSubstring.length(), chars, 0); 
    int strotel = 5; 
    int result = 1; 

    for (char c : chars) { 
     result *= ((int) c - 96) * strotel; 
    } 
    return String.valueOf(result); 
} 
+0

謝謝。我編輯了我的問題,在那裏你會找到getNumber方法,該方法處理@ ._ chars。但我需要把它放在我的代碼裏面? – YoranY

相關問題