4 개 변수 중 둘 이상이 설정되어 있으면 오류를 표시하고 싶습니다. 자바에서 .. 올라와서 ..자바의 어느 시점에서든 하나의 변수가 4 개의 변수 중 하나만 설정되어 있는지 확인하는 경우
나는 이것을하는 더 좋은 방법이 있는지 확인하고 싶었다. ..?
4 개 변수 중 둘 이상이 설정되어 있으면 오류를 표시하고 싶습니다. 자바에서 .. 올라와서 ..자바의 어느 시점에서든 하나의 변수가 4 개의 변수 중 하나만 설정되어 있는지 확인하는 경우
나는 이것을하는 더 좋은 방법이 있는지 확인하고 싶었다. ..?
카운터를 사용한 다음 1과 비교하는 것이 어떻습니까? 당신이 특정 개체의 속성을 확인하는 경우
뭔가 같은 ...
int i = 0;
if (isAset()) i++;
if (isBset()) i++;
if (isCset()) i++;
if (isDset()) i++;
if (i > 1)
...
는 다른 방법으로, 대신 속성 당 if 문 하나를 가지고 관련 속성을 반복하는 일부 반사를 사용할 수 있습니다.
편집 : 대신
static int trueCount(boolean... booleans) {
int sum = 0;
for (boolean b : booleans) {
if (b) {
sum++;
}
}
return sum;
}
: 마리우스 Žilėnas이의를 살펴 보자하는 일부 정돈 코드, 즉 사용하는 아래의 정적 메소드를 가변 인자 (A를위한 각각의 경우 및 삼항 표현의 oldschool 변경) 여러 if 문 중.
이것은 내 논리보다 덜 복잡해 보입니다. 감사! – user2280975
당신은이 표현 단순화 할 수 있습니다 :
당신은 진실을 테이블로 확인할 수 있습니다 :
if((isAset() || isCset()) && (isBset() || isDset()))
attri.greedySelectionException(..);
볼프람 알파 당신을 위해 일을했다
내가 잘못하지 않은 경우, OP에 표현식에 오류가 포함되어 있습니다 (즉, 'A'및 'C'는 고려하지 않음). Wolfram Alpha에 대한 링크를 제공해 주셔서 감사합니다. –
varargs ... (자바 자습서 참조)을 사용하고 몇 개의 트루가 주어 졌는지 계산하는 것이 좋습니다. 에 다음 코드를 보여줍니다
public class Values
{
public static boolean isASet()
{
return false;
}
public static boolean isBSet()
{
return true;
}
public static boolean isCSet()
{
return true;
}
public static boolean isDSet()
{
return true;
}
public static int booleans(boolean... booleans)
{
int sum = 0;
for (int i = 0; i < booleans.length; i++)
{
sum += booleans[i] ? 1 : 0;
}
return sum;
}
public static void main(String[] args)
{
System.out.println(
booleans(isASet(), isBSet(), isCSet(), isDSet()));
if (1 < booleans(isASet(), isBSet(), isCSet(), isDSet()))
{
System.out.println("Condition met.");
}
}
}
이 시도 :
if (!(isAset^isBset^isCset^isDset))
이 사실 단 하나라도 거짓 다른 true 또는입니다 것입니다.
첫 번째는 하나만 참이면 (처음에는 부정이 있음) FALSE입니다. 또한, 그 중 3 개가 참이라면 XOR도 참입니다. –
표현이 정확하다고 생각하지 않습니다. 부울은 네 번 모두 실행되지 않습니다. 표현식은 왼쪽에서 오른쪽으로 계산되므로 'true^true^true^false'와'true^false^false^false '는 동일한 값으로 평가됩니다. 그래서 분명히이 표현은 기대되는 것을주지 않습니다. – Buddha
정확히 무엇을 의미합니까. 그런데 XOR이 연관 연산자이기 때문에 n-ary XOR이 평가되는 순서는 결과에 영향을 미치지 않습니다. –
isAset(), isBSet, isCSet, & isDset 메서드의 구현을 제어 할 수있는 경우이 함수에서 true 또는 fales 대신 1 또는 0을 반환하면 훨씬 더 명확하게이 작업을 수행 할 수 있습니다. 당신이 제어 할 수없는 경우이 기능은
if(isASet() + isBSet() + isCSet() + isDSet() > 1)
ThrowMoreAreSetException()
... 더 이상의 변수가 사용 용도를 다음과 같이 설정되어있는 경우
public int isAset()
{
return (A != null) ? 1 : 0;
}
가 확인하려면 ... 아래로 작성하여야하며, 이 여기에이 approches 중 하나를 다음으로
int count = isASet() ? 1 : 0;
count+= isBSet() ? 1 : 0;
count+= isCSet() ? 1 : 0;
count+= isDSet() ? 1 : 0;
if(count > 1)
ThrowMoreAreSetException()
... 그것을하는 또 다른 방법입니다, 코드는 적은 서투른 및 somany의을 비교 한 조합을하는 것보다 더 읽을 수 있습니다.당신이 우아한 방법으로 스트림이 문제를 해결할 수있는 Java 8에서
(가 설정되지 않은 경우 값이 null 인 가정) :
if (Stream.of(valueA, valueB, valueC, valueD).filter(Objects::nonNull).count() != 1) {
/* throw error */
}
A와 C는 표현식이 거짓 :)을 반환 사실이라면 – Guido