比较两个数组。处理这些情况的聪明方法是什么?
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
}
}
}
我想用 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
}
}
}