比较两个数组。处理这些情况的聪明方法是什么?

Comparing two arrays. What's the smart way to handle the conditions?

我想用 2 个包含 2 个值的数组进行计算,并且我有 5 个公式用于 5 个不同的条件。

例如数组:

Array 1: [15, 17]
Array 2: [15, 16]

那么有5个条件:

AB AC - condition 1
AB AB - condition 2
AB AA - condition 3
AA AC - condition 4
AA AA - condition 5

它们总是至少有 1 个相同的值。如果它们只有 1 个相同的值,例如上面的示例,[15,17] 和 [15,16] 其中 15(或 A)存在于两者中,但 17(可以是 B 或 C)和 16(可以是 B 或c) 不同,这是第一个条件。如果它们相同,并且每个数组有 2 个不同的值,例如 [15,16] 和 [15,16],则这将是第二个条件。

执行此操作的明智方法是什么?我正在考虑使用 if...

if (condition 1){
   formula 1
}else if(condition 2){
   formula 2
}else if(condition 3){
   formula 3
}else if(condition 4){
   formula 4
}else if(condition 5){
   formula 5
}

但这看起来真的很可怕,我没有信心用它正确地编写条件。

遗憾的是,我看不出有任何方法可以摆脱这些测试。您可以使用 Map<Predicate, BiConsumer> 将它们隐藏在工厂 and/or 之间(其中 BiConsumer 是您的公式)。但是无论如何你都会有这 5 个条件。

拥有干净代码的要点是正确命名您的条件或谓词。

首先,正如我在评论中所说,为所有情况编写良好的单元测试。这些应该向您保证您最终编码的任何解决方案的正确性。我和许多人更愿意 实际代码之前编写单元测试(如果这听起来很奇怪并且您想了解更多信息,请搜索 TDD)。

其次,我的风格将使用嵌套的 if/else 语句(伪代码):

    if (arr1[0] != arr2[0]) {
        throw some exception;
    }

    if (arr1[0] == arr1[1]) { // we now know arr1[0] == arr2[0] == arr1[1]
        if (arr2[0] == arr2[1]) { // all equal
            assert arr1[1] == arr2[1];
            // condition 5
        } else {
            // condition 4
        }
    } else { // arr1[0] != arr1[1]
        if (arr2[0] == arr2[1]) { // arr1[0] == arr2[0] == arr2[1]
            // condition 3
        } else {
            if (arr1[1] == arr2[1]) {
                // condition 2
            } else {
                // condition 1
            }
        }
    }