我想顯示一個錯誤,如果設置了四個變量中的一個以上... 在Java中這是我想出了..如果條件檢查是否只有一個變量在JAVA中的任意點設置了四個變量
if((isAset() && isBset()) || (isBset() && isCset()) || (isCset() && isDset()) || (isDset() && isAset()))
attri.greedySelectionException(..);
我想檢查是否有更好的方式做到這一點..?
我想顯示一個錯誤,如果設置了四個變量中的一個以上... 在Java中這是我想出了..如果條件檢查是否只有一個變量在JAVA中的任意點設置了四個變量
if((isAset() && isBset()) || (isBset() && isCset()) || (isCset() && isDset()) || (isDset() && isAset()))
attri.greedySelectionException(..);
我想檢查是否有更好的方式做到這一點..?
您如何使用計數器,然後將其與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語句。
這看起來不那麼麻煩,比我的邏輯好得多。謝謝! – user2280975
可以簡化這個表達式:
if((isAset() || isCset()) && (isBset() || isDset()))
attri.greedySelectionException(..);
Wolfram Alpha的專爲您的工作:
您可以用真值表驗證:
如果我沒有弄錯,OP包含表達式中的錯誤,即它不考慮'A'&'C'。無論如何,感謝鏈接到Wolfram Alpha。 –
我建議使用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.");
}
}
}
試試這個:
if (!(isAset^isBset^isCset^isDset))
這將真正只爲之一爲真或者假。
首先,如果只有一個是真的,那麼它就是FALSE(開始時有一個否定)。而且,如果其中三個是真的,異或也是正確的。 –
我不認爲這個表達是準確的。所有四個布爾變量都不會立即運行,表達式將從左到右進行評估,因此「true」,「true」,「false」和「true」,「false」,「false」和「false」將被評估爲相同的值。所以顯然這個表達不會給出它所期望的。 – Buddha
我的意思是什麼。順便說一下,評估n元XOR的順序不會影響結果,因爲XOR是關聯運算符。 –
如果您對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對比組合更具可讀性。
在Java 8,你可以在一個優雅的方式解決了這個問題,流(假設你的值是零,如果他們沒有設置):
if (Stream.of(valueA, valueB, valueC, valueD).filter(Objects::nonNull).count() != 1) {
/* throw error */
}
如果A和C是真正的你的表情會返回false :) – Guido