检查是否在一个字符串中的每个字符属于给定的字符或没有(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;
}
}
你做一回声明,立即将第一次迭代中退出,只检查的第一个字符。
您需要将此信息存储在一个布尔值,并返回它,你检查过整串后:
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这些问题会更好。
你的if语句不会以这种方式工作,因为如果你用||连接,你将总是返回false。即使&&你也永远无法证明整个字符串! – 2013-02-28 10:52:05
是的,我复制粘贴他的代码,忘记更改操作员。修正它:) – 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语句的第一个条目来停止。
但是,如何检查集合[A,G,T,C]中的每个字符是否至少被使用过一次?另外,实际上需要“休息”吗? – 2013-02-28 18:37:45
在你的描述中没有必要这样做。 “并且至少有一个这样的人物。”所以并非所有人都必须出现,但至少要有四个人物中的一人。 – 2013-03-01 07:01:49
您可以使用正则表达式: - [ATCG]+
在这段代码看起来是这样的:
public boolean isValidDNA(){
return dna.matches("^[ATCG]+$")
}
符号'^'和'+ $'是什么意思? – 2013-02-28 11:06:01
请参阅我的答案中有关正则表达式的良好指南的链接。他们是一个非常强大的工具,但可能会写一些混乱......而且更糟糕的是:) – 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;
}
不寻常但有趣的实现。 – 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没有其他字符,空格等内容将继续
是否有任何异常被抛出? “dna”在哪里申报? – orique 2013-02-28 10:42:19
为什么不用这个检查的正则表达式? – Markus 2013-02-28 10:42:57
'return dna.matches(“^ [ATCG] + $”);'? – assylias 2013-02-28 10:44:49