2013-02-28 80 views
1

所以我需要創建一個方法isValidDNA它是這樣工作的:檢查是否在一個字符串中的每個字符屬於給定的字符或沒有(JAVA)

公共布爾isValidDNA()

如果DNA有效,則返回true,即僅包含字母, A,T,C,G(大寫)和至少一個這些字符。

所有我能想到的是這樣的,這顯然不工作:

public boolean isValidDNA(){ 
    for (int i=0;i<dna.length();i++){ 
     if (dna.charAt(i)=='A' || dna.charAt(i)=='T' || dna.charAt(i)=='C' || dna.charAt(i)=='G'){ 
      return true; 
     } 
     return false; 
    } 
} 
+0

是否有任何異常被拋出? 「dna」在哪裏申報? – orique 2013-02-28 10:42:19

+1

爲什麼不用這個檢查的正則表達式? – Markus 2013-02-28 10:42:57

+1

'return dna.matches(「^ [ATCG] + $」);'? – assylias 2013-02-28 10:44:49

回答

1

你做一回聲明,立即將第一次迭代中退出,只檢查的第一個字符。

您需要將此信息存儲在一個布爾值,並返回它,你檢查過整串後:

public boolean isValidDNA(String dna){ 
    Boolean result = true; 
    // Add an extra check for the "at least one character" thing. 
    for (int i=0; i<dna.length(); i++){ 
    if (dna.charAt(i)!='A' && dna.charAt(i)!='T' && dna.charAt(i)!='C' && dna.charAt(i)!='G'){ 
     result = false; 
    } 
    } 
    return result; 
} 

但是,你會使用regular expressions這些問題會更好。

+0

你的if語句不會以這種方式工作,因爲如果你用||連接,你將總是返回false。即使&&你也永遠無法證明整個字符串! – 2013-02-28 10:52:05

+0

是的,我複製粘貼他的代碼,忘記更改操作員。修正它:) – 2013-02-28 10:53:30

1

試試這樣說:

public boolean isValidDNA(){ 
    boolean res = true; 
    for (int i=0;i<dna.length();i++){ 
     if ((dna.charAt(i) != 'A') && (dna.charAt(i)!='T') && (dna.charAt(i)!='C') && (dna.charAt(i)!='G')){ 
      res = false; 
      break; 
     } 
    } 
    return res; 
} 

如果你的啓動點是,DNA是有效的,它更容易測試,如果它確實是這樣。您只需測試dna的每個字符,並可以通過不滿足if語句的第一個條目來停止。

+0

但是,如何檢查集合[A,G,T,C]中的每個字符是否至少被使用過一次?另外,實際上需要「休息」嗎? – 2013-02-28 18:37:45

+0

在你的描述中沒有必要這樣做。 「並且至少有一個這樣的人物。」所以並非所有人都必須出現,但至少要有四個人物中的一人。 – 2013-03-01 07:01:49

2

您可以使用正則表達式: - [ATCG]+在這段代碼看起來是這樣的:

public boolean isValidDNA(){ 
    return dna.matches("^[ATCG]+$") 
} 
+0

符號'^'和'+ $'是什麼意思? – 2013-02-28 11:06:01

+1

請參閱我的答案中有關正則表達式的良好指南的鏈接。他們是一個非常強大的工具,但可能會寫一些混亂......而且更糟糕的是:) – 2013-02-28 11:08:14

1

用自己的方式,你已經基本得到了它。

現在,如果您發現沒有問題,則返回true,如果全部出錯,則只返回false。您可以取消您的if條件,並在找到而不是的情況下立即返回false,如果一切正常,只返回true

我將把編碼部分留給你。

正如其他人指出的那樣,正則表達式在這裏將是一個更清潔的解決方案。

1

你可以試試這個實現。

首先聲明一個常數:

private static final String bases = "ATCG"; 

然後在這樣的方法使用它:

public boolean isValidDNA() { 
    boolean isValid = true; 
    for (char c : dna.toCharArray()) { 
     if (bases.indexOf(c) < 0) { 
      isValid = false; 
      break; 
     } 
    } 
    return isValid; 
} 
+0

不尋常但有趣的實現。 – 2013-02-28 11:02:46

1
Scanner sc = new Scanner(System.in); 
System.out.print("Enter a DNA sequence: "); 
seq=sc.nextLine();  
    if(seq.matches(".*[^ATCG].*")){ 
     System.out.println("Not a valid sequence."); 
     System.exit(0); 
} 

這個正則表達式的工作原理,以便只有方含A,C,T序列或G沒有其他字符,空格等內容將繼續

相關問題