Использование вложенных операторов if для сравнения неупорядоченных групп (не списков) - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть задание для создания объекта под названием Trio, который может содержать три объекта, которые реализуют сопоставимые. Вот заголовок:

public class Trio<T extends Comparable<? super T>> implements Comparable<Trio<T>>

При написании метода равенства я должен определить, являются ли два трио логически эквивалентными, если они содержат три одинаковых логически эквивалентных объекта в любом порядке.

Теперь я знаю, что мог бы поместить три объекта из каждого в два разных списка, отсортировать списки, а затем сравнить их по терминам, но я решил выписать логику как вложенную, если это

В 4 слоях имеется 15 if операторов.

Этот код входит в цикл for только тогда, когда ему абсолютно необходимо провести дополнительную проверку на предмет большего количества элементов:

@Override
public boolean equals(Object other) {
    if (other instanceof Trio<?>) {
        Trio<?> otherTrio = (Trio<?>) other;

        // Is there really a best practice for this? I feel like this
        // is most efficient since it creates no new objects

        if (!this.getItem(1).equals(otherTrio.getItem(1))) {

            if (!this.getItem(1).equals(otherTrio.getItem(2))) {

                if (!this.getItem(1).equals(otherTrio.getItem(3))) {
                    return false;
                }

                if (this.getItem(2).equals(otherTrio.getItem(1))) {

                    if (this.getItem(2).equals(otherTrio.getItem(2))) {
                        return false;
                    }

                    if (this.getItem(3).equals(otherTrio.getItem(1))) {
                        return false;
                    }

                    return true;

                }

                if (this.getItem(3).equals(otherTrio.getItem(2))) {
                    return false;
                }

                return true;

            }

            if (this.getItem(2).equals(otherTrio.getItem(3))) {

                if (this.getItem(2).equals(otherTrio.getItem(1))) {
                    return false;
                }

                if (this.getItem(3).equals(otherTrio.getItem(3))) {
                    return false;
                }

                return true;

            }

            if (this.getItem(3).equals(otherTrio.getItem(1))) {
                return false;
            }

            return true;

        }

        if (!this.getItem(2).equals(otherTrio.getItem(2))) {

            if (!this.getItem(2).equals(otherTrio.getItem(3))) {
                return false;
            }

            if (!this.getItem(3).equals(otherTrio.getItem(2))){
                return false;
            }

            return true;

        }

        if (!this.getItem(3).equals(otherTrio.getItem(3))) {
            return false;
        }

        return true;

    } else
        return false;

}

Является ли этот код хорошей практикой? Это кажется мне липким, но я не мог придумать более элегантного способа сделать это, кроме моего метода, который я описал выше.

...