2013-02-25 2 views
1

그래서 EnumSet을 대신 사용하기 위해 응용 프로그램의 일부 비트 필드를 변환하고 X | Y 비교를위한 더 좋은 방법이 있는지 궁금합니다.EnumSet 중 하나 또는 둘 다 확인하기

if(enumSet.contains(X) || enumSet.contains(Y)) { 
    //do stuff 
} 

이 할 수있는 청소기 방법이 있나요 :

if(bitfield & (X | Y) != 0) { 
    //do stuff 
} 

각각 EnumSet 해당하는 것으로 보인다 : 현재 우리는 같은 것이 있습니까? 난 당신과 같이 containsAll()를 확인할 수 있습니다 알고

EnumSet flagsToCheck = EnumSet.of(X, Y); 
if(enumSet.containsAll(flagsToCheck)) { 
    //do stuff 
} 

그러나 당신이 (X & Y)이 설정되어 있는지 알고 싶은 시나리오입니다. (X | Y)을 확인하는 동일한 방법이 있습니까? 나는 containsAny() 메쏘드 같은 것이있을 것이라고 생각 하겠지만 그 효과가있는 것 같지는 않습니다.

답변

6

나는 기존 접근 방식이 비트 접근 방식보다 더 많다는 것을 알고 있습니다.. 그것은 당신이 의미하는 것을 정확하게 말합니다 : 세트가 X를 포함하거나 세트가 Y를 포함한다면 ... 그대로 유지하십시오. 벌써 깨끗해.

세트가 커지면

, 당신은 사용할 수 있습니다

EnumSet<Foo> valid = EnumSet.of(Foo.X, Foo.Y, Foo.A, Foo.B); 
valid.retainAll(enumSet); 
if (valid.isEmpty()) { 
    ... 
} 

그러나 나는 단지 더 큰 경우에 그 계속 것입니다. 두세 가지 옵션을 사용하려면 필기체 형식을 사용하십시오.

+1

원본 세트를 변경하지 않으려면 반대쪽 ('! valid.retainAll (enumSet)')을 원할 수도 있습니다. – assylias

+0

나는 @ assylias의 요점에 관해서 논평하려했다. 작은 세트의 개인으로서 더 읽기 쉽다는 것은 아마 옳은 것 같습니다. – kcoppock

+0

@assylias : 완료, 감사합니다. –

1

AbstractSet 메서드 removeAll (요소가 발견되면 true)을 사용할 수 있습니다. 분명히 원래 세트의 클론으로 그렇게하고 싶을 것입니다.

+0

참, 확인하는 것도 좋은 방법입니다. 난 그냥 불필요한 복사를 피하기 위해. – kcoppock

+1

반대쪽 (찾고있는 값 세트에서 원래 세트의 removeAll)을 수행한다는 설명도 여기에 적용됩니다. – SJuan76

1

세트를 업데이트 할 수없는 경우 새 것을 만드십시오 ... @assylias가 맞습니다. 옵션은 원하는 열거 형 값을 기반으로 새 세트를 작성하고 그에 따라 변경/검증하는 것입니다.

public enum ResultingState { 
    NOT_PERSISTED, PERSISTED, NOT_CALCULATED, CALCULATED; 
} 
EnumSet<ResultingState> errorsState = EnumSet.of(ResultingState.NOT_PERSISTED, ResultingState.NOT_CALCULATED); 
Collection<ResultingState> results = new HashSet<>(phaseResults.values()); 
boolean containsAny = results.retainAll(errorsState) && results.size() > 0; 
관련 문제