2013-11-25 1 views

답변

8

카운터를 사용한 다음 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 문 중.

+0

이것은 내 논리보다 덜 복잡해 보입니다. 감사! – user2280975

3

당신은이 표현 단순화 할 수 있습니다 :

Original expression

당신은 진실을 테이블로 확인할 수 있습니다 :

Original

if((isAset() || isCset()) && (isBset() || isDset())) 
    attri.greedySelectionException(..); 

볼프람 알파 당신을 위해 일을했다

Final

+1

내가 잘못하지 않은 경우, OP에 표현식에 오류가 포함되어 있습니다 (즉, 'A'및 'C'는 고려하지 않음). Wolfram Alpha에 대한 링크를 제공해 주셔서 감사합니다. –

0

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."); 
     } 
    } 
} 
-3

이 시도 :

if (!(isAset^isBset^isCset^isDset)) 

이 사실 단 하나라도 거짓 다른 true 또는입니다 것입니다.

+0

첫 번째는 하나만 참이면 (처음에는 부정이 있음) FALSE입니다. 또한, 그 중 3 개가 참이라면 XOR도 참입니다. –

+0

표현이 정확하다고 생각하지 않습니다. 부울은 네 번 모두 실행되지 않습니다. 표현식은 왼쪽에서 오른쪽으로 계산되므로 'true^true^true^false'와'true^false^false^false '는 동일한 값으로 평가됩니다. 그래서 분명히이 표현은 기대되는 것을주지 않습니다. – Buddha

+0

정확히 무엇을 의미합니까. 그런데 XOR이 연관 연산자이기 때문에 n-ary XOR이 평가되는 순서는 결과에 영향을 미치지 않습니다. –

0

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에서

0

(가 설정되지 않은 경우 값이 null 인 가정) :

if (Stream.of(valueA, valueB, valueC, valueD).filter(Objects::nonNull).count() != 1) { 
    /* throw error */ 
}