Сравнивая два массива.Какой умный способ справиться с условиями? - PullRequest
0 голосов
/ 07 декабря 2018

Я хочу вычислить с 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 одинаковое значение.Если они имеют только одно и то же значение, как в примере выше, [15,17] и [15,16], где 15 (или A) существует в обоих, но 17 (может быть B или C) и 16 (может быть B илиВ) разные, это первое условие.Если они идентичны и каждый массив имеет 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
}

Но это выглядит действительно отвратительно, и я не уверен, чтобы правильно написать условия с этим.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Во-первых, как я сказал в комментарии, напишите хорошие модульные тесты для всех случаев.Это должно гарантировать вам правильность любого решения, которое вы в конечном итоге кодируете.Я и многие предпочли бы написать модульные тесты перед фактическим кодом (ищите TDD, если это звучит странно, и вы хотите узнать больше).

Во-вторых, мой стиль будет использовать вложенный, если/ 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
            }
        }
    }
0 голосов
/ 07 декабря 2018

К сожалению, я не вижу способа избавиться от этих испытаний.Вы можете скрыть их между фабриками и / или использовать Map<Predicate, BiConsumer> (где BiConsumer - ваша формула).Но, так или иначе, у вас будут эти 5 условий.

Главное, чтобы иметь чистый код, это правильно назвать ваши условия или предикаты.

...