[ https://issues.apache.org/jira/browse/LANG-1627?focusedWorklogId=788017&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-788017 ]
ASF GitHub Bot logged work on LANG-1627: ---------------------------------------- Author: ASF GitHub Bot Created on: 05/Jul/22 19:05 Start Date: 05/Jul/22 19:05 Worklog Time Spent: 10m Work Description: garydgregory commented on PR #890: URL: https://github.com/apache/commons-lang/pull/890#issuecomment-1175402822 Closing: I brought this in slightly differently, using `oneHot()` instead of `xorOneHot` and other minor changes; please see git master. Issue Time Tracking ------------------- Worklog Id: (was: 788017) Time Spent: 1.5h (was: 1h 20m) > BooleanUtils.xor not behaving as expected with any odd number of true's > ----------------------------------------------------------------------- > > Key: LANG-1627 > URL: https://issues.apache.org/jira/browse/LANG-1627 > Project: Commons Lang > Issue Type: Bug > Affects Versions: 3.11 > Reporter: Alberto Scotto > Priority: Major > Time Spent: 1.5h > Remaining Estimate: 0h > > Hi, > I was expecting a xor function that takes a variable number of arguments to > *return true if and only if exactly one among all of the arguments is true*, > regardless of the number of arguments. > This holds true given three false's: > {code:java} > @Test > public void threeFalse() { > boolean[] bools = new boolean[]{Boolean.FALSE, Boolean.FALSE, Boolean.FALSE}; > assertFalse(BooleanUtils.xor(bools)); > }{code} > > It also holds true given 4 true's, as well as for any even number of trues. > {code:java} > @Test > public void fourTrue() { > boolean[] bools = new boolean[]{Boolean.TRUE, Boolean.TRUE, > Boolean.TRUE, Boolean.TRUE}; > assertFalse(BooleanUtils.xor(bools)); > } > {code} > The above tests pass. > But with any odd number of true's that doesn't hold anymore: > > {code:java} > @Test > public void threeTrue() { > boolean[] bools = new boolean[]{Boolean.TRUE, Boolean.TRUE, Boolean.TRUE}; > assertFalse(BooleanUtils.xor(bools)); > } > {code} > This test fails. > That was totally unexpected to me. > But as it turns out, even > {noformat} > true ^ true ^ true{noformat} > evaluates to true. That was unexpected too to me, at a first sight. > The thing is that xor (I mean the original boolean operator) is a binary > operator, so if you want to make it n-ary, one simple solution is to apply it > in two by two: ((a ^ b) ^ c) ^ d > And that's what is done in the implementation of the method BooleanUtils#xor. > But that brings to BooleanUtils.xor(true, true, true) == true, and at the > same time BooleanUtils.xor(true, true, true, true) == false, which just > doesn't sound right to me. > Whether or not you agree with me that that is a bug of the method, please at > least update the Javadoc, because right now it is not providing the user > enough information. Look: > {code:java} > Performs an xor on a set of booleans. > BooleanUtils.xor(true, true) = false > BooleanUtils.xor(false, false) = false > BooleanUtils.xor(true, false) = true > {code} > > Thanks. > Cheers -- This message was sent by Atlassian Jira (v8.20.10#820010)