Есть ли чистый синтаксис для проверки того, имеет ли значение несколько переменных одинаковое значение?
У нас есть n переменных X = {x1,x2,...xn}
они не находятся в каких-либо структурах.
В python, например, я могу это сделать: if (x1 == x2 == x3 == xn):
В java я должен сделать: if((x1 == x2) && (x2 == x3) && (x3 == xn)):
Знаете ли вы простой способ улучшить этот синтаксис? (Представьте себе очень длинное имя переменной и многое из них)
Спасибо.
Ответы
Ответ 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
Еще один быстрый способ достичь этого будет через маршрут преобразования array
→ List
→ HashSet
, как в:
Стандартная 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
.