program story

부울 배열의 모든 값이 참인지 확인하는 가장 우아한 방법은 무엇입니까?

inputbox 2021. 1. 9. 09:52
반응형

부울 배열의 모든 값이 참인지 확인하는 가장 우아한 방법은 무엇입니까?


Java에 부울 배열이 있습니다.

boolean[] myArray = new boolean[10];

모든 값이 참인지 확인하는 가장 우아한 방법은 무엇입니까?


public static boolean areAllTrue(boolean[] array)
{
    for(boolean b : array) if(!b) return false;
    return true;
}

Arrays.asList(myArray).contains(false)

Java 8에서는 다음을 수행 할 수 있습니다.

boolean isAllTrue = Arrays.asList(myArray).stream().allMatch(val -> val == true);

또는 더 짧게 :

boolean isAllTrue = Arrays.stream(myArray).allMatch(Boolean::valueOf);

참고 :Boolean[] 이 솔루션이 작동 하려면 필요 합니다. 기본 목록을 가질 수 없기 때문입니다.


이 정보를 두 번 이상 찾고자하는 횟수에 따라 다릅니다.

Set<Boolean> flags = new HashSet<Boolean>(myArray);
flags.contains(false);

그렇지 않으면 단락 된 루프 :

for (i = 0; i < myArray.length; i++) {
  if (!myArray[i]) return false;
}
return true;

나는 BitSet해결책 이 없다는 것을 믿을 수 없다 .

A BitSet는 비트 집합에 대한 추상화이므로 boolean[]필요한 대부분의 메서드가 이미 포함되어 있으므로 더 이상 고급 상호 작용 에 사용할 필요가 없습니다 . 또한 내부적으로 long값을 사용하여 비트를 저장하고 .NET과 같이 모든 비트를 개별적으로 확인하지 않기 때문에 일괄 작업에서 매우 빠릅니다 boolean[].

BitSet myBitSet = new BitSet(10);
// fills the bitset with ten true values
myBitSet.set(0, 10);

특정 경우에는 다음을 사용합니다 cardinality().

if (myBitSet.cardinality() == myBitSet.size()) {
    // do something, there are no false bits in the bitset
}

또 다른 대안은 Guava를 사용하는 것입니다 .

return Booleans.contains(myArray, true);

Java 8 이상에서는 to IntStream범위에서 0myArray.length만들고 모든 값이 true다음과 같은 해당 (원시) 배열에 있는지 확인할 수 있습니다.

return IntStream.range(0, myArray.length).allMatch(i -> myArray[i]);

해당 라인은 충분해야합니다.

BooleanUtils.and(boolean... array)

그러나 링크 전용 순수 주의자들을 진정시키기 위해 :

부울 세트에 대해 및를 수행합니다.


This is probably not faster, and definitely not very readable. So, for the sake of colorful solutions...

int i = array.length()-1;
for(; i > -1 && array[i]; i--);
return i==-1

boolean alltrue = true;
for(int i = 0; alltrue && i<booleanArray.length(); i++)
   alltrue &= booleanArray[i];

I think this looks ok and behaves well...


You can check all value items are true or false by compare your array with the other boolean array via Arrays.equal method like below example :

private boolean isCheckedAnswer(List<Answer> array) {
    boolean[] isSelectedChecks = new boolean[array.size()];
    for (int i = 0; i < array.size(); i++) {
        isSelectedChecks[i] = array.get(i).isChecked();
    }

    boolean[] isAllFalse = new boolean[array.size()];
    for (int i = 0; i < array.size(); i++) {
        isAllFalse[i] = false;
    }

    return !Arrays.equals(isSelectedChecks, isAllFalse);
}

OK. This is the "most elegant" solution I could come up with on the fly:

boolean allTrue = !Arrays.toString(myArray).contains("f");

Hope that helps!

ReferenceURL : https://stackoverflow.com/questions/8260881/what-is-the-most-elegant-way-to-check-if-all-values-in-a-boolean-array-are-true

반응형