检查是否在一个字符串中的每个字符属于给定的字符或没有(JAVA)

问题描述:

所以我需要创建一个方法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

你做一回声明,立即将第一次迭代中退出,只检查的第一个字符。

您需要将此信息存储在一个布尔值,并返回它,你检查过整串后:

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

试试这样说:

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

您可以使用正则表达式: - [ATCG]+在这段代码看起来是这样的:

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

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

+1

请参阅我的答案中有关正则表达式的良好指南的链接。他们是一个非常强大的工具,但可能会写一些混乱......而且更糟糕的是:) – 2013-02-28 11:08:14

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

现在,如果您发现没有问题,则返回true,如果全部出错,则只返回false。您可以取消您的if条件,并在找到而不是的情况下立即返回false,如果一切正常,只返回true

我将把编码部分留给你。

正如其他人指出的那样,正则表达式在这里将是一个更清洁的解决方案。

你可以试试这个实现。

首先声明一个常数:

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

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没有其他字符,空格等内容将继续