【问题标题】:How to handle bad input如何处理错误的输入
【发布时间】:2016-01-26 01:42:07
【问题描述】:

我正在尝试编写一个代码来确定 DNA 序列的两个输入是否是反向互补。该程序要求用户将序列作为字符串提供。 我的代码可以正常执行,但我想编写一个 if 语句,如果字符都是 'A' 'T' 'C' 或 'G' 则继续执行程序。

这是我自己想出来的,但它不起作用,甚至看起来都不近。我是这门语言的新手,来自 ADA,我很难过任何帮助都会很棒。

if ( seqFirst.charAt(i) !=  'A' || seqFirst.charAt(i) != 'T' || 
                 seqFirst.charAt(i) != 'C' || seqFirst.charAt(i) != 'G' || 
                 seqSecond.charAt(i) !=  'A' || seqSecond.charAt(i) != 'T' || 
                 seqSecond.charAt(i) != 'C' || seqSecond.charAt(i) != 'G' )

【问题讨论】:

  • 所以,看起来您正在尝试检查是否有任何字符是错误的,在这里,大概是退出 then 子句,对吧?你需要在这里使用and,而不是@StephenC 回答的or

标签: java dna-sequence


【解决方案1】:

您只需在整个条件表达式中将|| 更改为&&

作为解释,请考虑以下代码的简化版本:

  if (c != 'A' || c != 'T' ) { // IS BAD }

并考虑c'A' 的情况。第一个谓词计算为false。第二个谓词计算为true。整个表达式是false || true ... true ... "BAD"

现在将|| 更改为&&,您将得到false && true ... false ...“不错”


我是语言新手,来自 ADA ...

这不是真正的问题。问题在于理解布尔代数是如何工作的。即DeMorgan's Laws

【讨论】:

  • @Reimeus @Brian 好吧,所以当我使用 && 时,它总是说“不是 DNA”,当我使用 || 时,它总是说是 DNA
  • @A.Jarrett - 你真的需要理解这里的逻辑。真的。彻底。如果你不理解它,你很可能会再次犯同样的错误。 1) 阅读/理解有关德摩根定律的链接。 2) 自己用铅笔和纸写出真值表。
  • 看我本学期应该在这门课上,但它已经满了。
  • @A.Jarrett - 教学大纲中的“离散数学”课程(IMO)非常重要。
【解决方案2】:

据我所知,当其中一个等于另一个时,2 个 DNA 字符串是反向互补,但是反向并且核苷酸发生了变化。由于我不知道你的Java版本,我在Java7中写了一些可读的方法:

public static boolean isComplimentaryReverse(String str1, String str2) {
    //invalid input, could throw exception
    if (str1.length() != str2.length()) {
        return false;
    }
    //could be static final field
    Map<Character, Character> replaceTable = new HashMap<>();
    replaceTable.put('G', 'C');
    replaceTable.put('C', 'G');
    replaceTable.put('T', 'A');
    replaceTable.put('A', 'T');

    String reverseStr1 = new StringBuilder(str1).reverse().toString();
    for (int i = 0; i < str2.length(); i++) {
        //invalid input, could throw exception
        if (!replaceTable.containsKey(reverseStr1.charAt(i))) {
            return false;
        }
        if (str2.charAt(i) != replaceTable.get(reverseStr1.charAt(i))) {
            return false;
        }
    }
    return true;
}

【讨论】:

    【解决方案3】:

    使用正则表达式进行简化。

    private static final String VALID_DNA = "[ATCG]+";
    ...
    
    if (seqFirst.matches(VALID_DNA) && seqSecond.matches(VALID_DNA)) {
        // keep going...
    }
    

    【讨论】:

    • 你能解释一下吗,就像我说我是菜鸟一样。
    • 如果您不熟悉正则表达式,可以通过任何搜索引擎获得大量信息。简而言之,这会检查您的字符串 seqFirstseqSecond 并确保它们不为空且仅包含字母 A、T、C 或 G。
    【解决方案4】:

    我发现可能存在德摩根定律问题。记住 !(a 或 b) = !a 和 !b。

    【讨论】:

    • 没上过那门课。
    • 没关系。我是说要么将他们所有的||(或)更改为&&。或者你可以把 ! (否定)。你更容易理解的。
    • if (!( seqFirst.charAt(i) == 'A' || seqFirst.charAt(i) == 'T' || seqFirst.charAt(i) == 'C' | | seqFirst.charAt(i) == 'G' || seqSecond.charAt(i) == 'A' || seqSecond.charAt(i) == 'T' || seqSecond.charAt(i) == 'C ' || seqSecond.charAt(i) == 'G' ))
    • 欢迎来到Stack Overflow!这是评论,不是答案。请编辑以提供有用的答案,以便您获得足够的代表以离开 cmets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多