我有一个构造函数,它接受一个字符串作为参数。每次传递给构造函数的字符串包含任何不是“A”,“C”,“G”或“T”的内容时,我想抛出一个运行时异常。目前这是我的代码:
public DNAStrandNovice(String strand) {
passedStrand = strand;
if (passedStrand.contains("a") || passedStrand.contains("c")
|| passedStrand.contains("g") || passedStrand.contains("t")) {
throw new RuntimeException("Illegal DNA strand");
} else if (passedStrand.contains("1") || passedStrand.contains("2")
|| passedStrand.contains("3") || passedStrand.contains("4")
|| passedStrand.contains("5") || passedStrand.contains("6")
|| passedStrand.contains("7") || passedStrand.contains("8")
|| passedStrand.contains("9") || passedStrand.contains("0")) {
throw new RuntimeException("Illegal DNA Strand");
} else if (passedStrand.contains(",") || passedStrand.contains(".")
|| passedStrand.contains("?") || passedStrand.contains("/")
|| passedStrand.contains("<") || passedStrand.contains(">")) {
throw new RuntimeException("Illegal DNA Strand");
}
}
我觉得这可以用更简洁的方式实现,但我不知道如何实现。现在我只是检查每个不是大写字母“A”,“C”,“G”或“T”的字符并抛出运行时异常,但我觉得它太繁琐和糟糕的编程风格。有人有什么想法吗?
答案 0 :(得分:2)
负面检查,而非积极检查。
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) != 'A' && str.charAt(i) != 'C'
&& str.charAt(i) != 'G' && str.charAt(i) != 'T') {
throw new IllegalArgumentException("Bad character " + str.charAt(i));
}
}
......或者更短,
for (int i = 0; i < str.length(); i++) {
if (!"ACGT".contains(str.charAt(i))) {
throw new IllegalArgumentException("Bad character " + str.charAt(i));
}
}
答案 1 :(得分:2)
您可以使用正则表达式(正则表达式):
来实现此目的public DNAStrandNovice(String strand) {
if (!strand.matches("[ACGT]+")) { //or [ACGT] <-- see note below
throw new RuntimeException("Illegal DNA strand");
}
passedStrand = strand;
}
正则表达式[ACGT]+
表示字符串必须包含一个或多个字符,并且每个字符必须是A,C,G或T中的一个。!
在strand.matches
前面反转 matches
返回的布尔值,本质上意味着如果字符串与正则表达式不匹配,则抛出RuntimeException
注意:如果您需要字符串完全一个字符,请使用正则表达式[ACGT]
。如果您需要允许空格,您可以使用[ACGT ]+
(然后修剪并检查为空)或[ACGT][ACGT ]+
(这可确保第一个字符不是空格)。
您甚至可以执行更复杂且功能强大的正则表达式检查,例如应该包含四个字符的模式,其中包含空格(例如ATCG TACG
),甚至只显示某些字符在某些地方,只有A和C可以显示为前两个字符,并且只有G和T可以显示在其后面(示例ACTG
正确而AGTC
错误)。 我将把所有这些留作练习。
答案 2 :(得分:1)
建议不要使用例外。定义枚举并传递它。
public enum DnaCode { A, C, G, T }
...
public DNAStrandNovice(List<DnaCode> strand) {
...
}
如果您愿意,可以将其设为DnaCode []。您可以控制输入并避免处理中断的控制流。抛出异常是相当昂贵的,并不是真正用作流量控制的方法。
答案 3 :(得分:0)
您可以通过manaully循环遍历字符并使用ifs或Set检查字母来提高代码效率。
但老实说,除非性能是一个问题,否则它是如此的好。非常明显且易于维护。
答案 4 :(得分:0)
我有可能跳进去......
public boolean validateLetter(String letter){
HashMap<String, String> dna = new HashMap<String, String>();
dna.put("A", "A");
dna.put("C", "C");
dna.put("G", "G");
dna.put("T", "T");
if(dna.get(letter) == null){
System.out.println("fail");
return false;
} else {
return true;
}
}
我也不会将该代码放在构造函数中,而是将其放在自己的方法中并从构造函数中调用。
答案 5 :(得分:0)
public DNAStrandNovice(String strand){
if(strand.matches("^[A-Za-z]*[0-9]+[A-Za-z]*$") || strand.matches("^[a-zA-Z]*[^a-zA-Z0-9][a-zA-Z]*$") || strand.matches("^[A-Za-z]*[acgt]+[A-Za-z]*$")){
throw new RuntimeException("Illegal DNA strand");
}
}