Подтвердить что ты не робот

Есть ли чистый синтаксис для проверки того, имеет ли значение несколько переменных одинаковое значение?

У нас есть n переменных X = {x1,x2,...xn} они не находятся в каких-либо структурах.

В python, например, я могу это сделать: if (x1 == x2 == x3 == xn):

В java я должен сделать: if((x1 == x2) && (x2 == x3) && (x3 == xn)):

Знаете ли вы простой способ улучшить этот синтаксис? (Представьте себе очень длинное имя переменной и многое из них)

Спасибо.

4b9b3361

Ответ 1

Если у вас много таких переменных, считаете ли вы, что они помещают их в коллекцию, а не как их отдельные переменные? В этот момент есть различные варианты.

Если вы обнаружите, что делаете это много, вы можете написать вспомогательные методы, возможно, используя синтаксис varargs. Например:

public static boolean areAllEqual(int... values)
{
    if (values.length == 0)
    {
        return true; // Alternative below
    }
    int checkValue = values[0];
    for (int i = 1; i < values.length; i++)
    {
        if (values[i] != checkValue)
        {
            return false;
        }
    }
    return true;
}

Альтернатива, представленная glowcoder, заключается в том, чтобы заставить ее иметь хотя бы одно значение:

public static boolean areAllEqual(int checkValue, int... otherValues)
{
    for (int value : otherValues)
    {
        if (value != checkValue)
        {
            return false;
        }
    }
    return true;
}

В любом случае используйте с:

if (HelperClass.areAllEqual(x1, x2, x3, x4, x5))
{
    ...
}

Ответ 2

Вы можете создать способ утилиты, подобный этому:

public boolean allEqual(Object... objs) {
    if(objs.length < 2) return true; // 0 or 1 objects are all equal
    Object key = objs[0]; // pick one
    for(Object o : objs) if(!o.equals(key)) return false;
    return true;
}

Другой вариант:

public boolean allEqual(Object key, Object... objs) {
    for(Object o : objs) if(!o.equals(key)) return false;
    return true;
}

Чтобы упростить множество логических схем. Затем просто ходите

if(allEqual(x,x1,x2,x3))

Очевидно, что эти два являются взаимоисключающими (они однозначно однозначны), но вы могли бы allEqual и allEqualWithKey

Ответ 3

Аналогично решению @Jon, но короче.

public static boolean areAllTheSame(int value, int... values) {
    for (int i: values) if(value != i) return false;
    return true;
}

Ответ 4

Вы можете написать метод, который делает этот взгляд менее громоздким:

boolean areAllEqual(Object... values) {
    if (values.length < 2) {
        return true;
    }

    for (int i = 1; i < values.length; i++) {
        if (!values[i].equals(values[0])) {
            return false;
        }
    }

    return true;
}

Используйте его следующим образом:

if (areAllEqual(x1, x2, x3, x4, x5)) {
    // do something
}

edit Слишком медленно...!: - (

Ответ 5

К сожалению, нет, нет синтаксического сахара. Это обычная проблема с Java.

Ответ 6

Если вам не нравится вводить текст, вы можете потерять вложенные парезы:

if(x1 == x2 && x2 == x3 && x3 == xn);

Ответ 7

Еще один быстрый способ достичь этого будет через маршрут преобразования arrayListHashSet, как в:

Стандартная Java:

if(new HashSet<Object>(Arrays.asList(x1, x2, x3, x4, x5)).size() == 1) {

}

Google Guava:

if(Sets.newHashSet(Ints.asList(x1, x2, x3, x4, x5)).size() == 1) {

}

Вышеупомянутое решение не выглядит слишком чистым в своем собственном праве, поэтому его обязательно следует изолировать в отдельный метод утилиты с разумным именем (в этом случае вам, вероятно, будет лучше с Питером Лори или Джоном Решение скита в первую очередь).

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

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

Ответ 8

Мне нравится эталонная логика, которая уже была предложена, но обычно любой из аргументов в списке может быть null, что может вызвать выброс NullPointerException. Поэтому мы должны сначала проверить null и использовать == для сравнения ссылок на объекты:

public static boolean allEqual(Object key, Object... objs) {
    for(Object o : objs)
        if((key != null && !key.equals(o)) || key != o) return false;
    return true;
}

Ответ 9

В Java 8 это можно сделать как однострочный, используя Stream:

boolean allEqual = Stream.of(x1, x2, x3, x4).distinct().count() == 1;

В основном distinct это фильтрует поток, так что остаются только уникальные элементы. Если в этом потоке имеется ровно один элемент, это означает, что все исходные элементы равны.

Ответ 10

org.apache.commons.lang3.BooleanUtils public static boolean и (final boolean... array)

Ответ 11

В Java 8 мне нравится использовать java.util.stream.Stream для этого:

boolean b = Stream.of(obj1, obj2, obj3).anyMatch(it -> it == null)

чтобы выяснить, равен ли какой-либо из заданных объектов obj1, obj2 или obj3.