2013-11-25 36 views

回答

8

您如何使用計數器,然後將其與1進行比較?

喜歡的東西...

int i = 0; 
if (isAset()) i++; 
if (isBset()) i++; 
if (isCset()) i++; 
if (isDset()) i++; 

if (i > 1) 
    ... 

另外,如果您正在檢查某個對象的屬性,你可以使用一些反射通過相關性進行迭代,而不是if語句每個屬性有一個。

編輯:看看的MariusŽilėnas的可變參數下面的一些更整潔的代碼中使用,即,靜態的方法(改變了舊校園用於向的for-each和三元表達爲一個if):

static int trueCount(boolean... booleans) { 
    int sum = 0; 
    for (boolean b : booleans) { 
    if (b) { 
     sum++; 
    } 
    } 
    return sum; 
} 

代替幾個if語句。

+0

這看起來不那麼麻煩,比我的邏輯好得多。謝謝! – user2280975

3

可以簡化這個表達式:

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

Wolfram Alpha的專爲您的工作:

Original expression

您可以用真值表驗證:

Original

Final

+1

如果我沒有弄錯,OP包含表達式中的錯誤,即它不考慮'A'&'C'。無論如何,感謝鏈接到Wolfram Alpha。 –

0

我建議使用varargs ...(請參閱Java教程)並創建一個函數來計算給出了多少個trues。下面的代碼演示了:

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)) 

這將真正只爲之一爲真或者假。

+0

首先,如果只有一個是真的,那麼它就是FALSE(開始時有一個否定)。而且,如果其中三個是真的,異或也是正確的。 –

+0

我不認爲這個表達是準確的。所有四個布爾變量都不會立即運行,表達式將從左到右進行評估,因此「true」,「true」,「false」和「true」,「false」,「false」和「false」將被評估爲相同的值。所以顯然這個表達不會給出它所期望的。 – Buddha

+0

我的意思是什麼。順便說一下,評估n元XOR的順序不會影響結果,因爲XOR是關聯運算符。 –

0

如果您對isAset(),isBSet,isCSet,& isDset方法的實現有控制權,如果您從此函數返回1或0而不是true或fales,則可以更清晰地實現此目的。這些功能將被創建如下...

public int isAset() 
{ 
    return (A != null) ? 1 : 0; 
} 

要驗證是否超過一個變量被設置使用使用類似下面...

if(isASet() + isBSet() + isCSet() + isDSet() > 1) 
    ThrowMoreAreSetException() 

如果你沒有在控制這是在這裏做的另一種方式......

int count = isASet() ? 1 : 0; 
count+= isBSet() ? 1 : 0; 
count+= isCSet() ? 1 : 0; 
count+= isDSet() ? 1 : 0; 

if(count > 1) 
ThrowMoreAreSetException() 

通過以下這兩種approches的,代碼會少笨拙,不是做somany對比組合更具可讀性。

0

在Java 8,你可以在一個優雅的方式解決了這個問題,流(假設你的值是零,如果他們沒有設置):

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