int 값과 관련된 열거 형 가져 오기
이전에는 LegNo 열거 형을 다음과 같이 간단히 정의했습니다.
NO_LEG, LEG_ONE, LEG_TWO
를 호출 return LegNo.values()[i];
하여 각 열거 형과 관련된 값을 가져올 수있었습니다.
하지만 이제 LegNo
열거 형 NO_LEG
을 0 대신 int -1로 지정 했으므로 개인 생성자를 사용하여 int 값을 초기화하고 설정하기로 결정했습니다.
NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);
private LegNo(final int leg) { legNo = leg; }
이제 유일한 것은 내가 이런 식으로하기 때문에 values()
메소드가 NO_LEG
열거 형에 대해 작동하지 않는다는 것입니다 . int와 관련된 enum을 어떻게 얻습니까? case switch 문 또는 if-elseif-elseif를 사용하는 것 외에이 작업을 수행하는 효율적인 방법이 있습니까?
열거 형에서 int 값을 얻는 것과 관련된 많은 질문을 볼 수 있지만 그 반대입니다.
2018 년 8 월 수정
오늘 나는 이것을 다음과 같이 구현할 것입니다.
public enum LegNo {
NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);
private final int value;
LegNo(int value) {
this.value = value;
}
public static Optional<LegNo> valueOf(int value) {
return Arrays.stream(values())
.filter(legNo -> legNo.value == value)
.findFirst();
}
}
열거 형 내부에 매핑을 유지해야합니다.
public enum LegNo {
NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);
private int legNo;
private static Map<Integer, LegNo> map = new HashMap<Integer, LegNo>();
static {
for (LegNo legEnum : LegNo.values()) {
map.put(legEnum.legNo, legEnum);
}
}
private LegNo(final int leg) { legNo = leg; }
public static LegNo valueOf(int legNo) {
return map.get(legNo);
}
}
정적 블록은 한 번만 호출되므로 여기에는 성능 문제가 거의 없습니다.
편집 : valueOf
다른 Java 클래스와 더 많은 인라인으로 메서드 이름이 변경 되었습니다.
모든 멤버를 반복하고 올바른 멤버를 반환하는 정적 메서드를 열거 형에 포함 할 수도 있습니다.
public enum LegNo {
NO_LEG(-1),
LEG_ONE(1),
LEG_TWO(2);
private int legIndex;
private LegNo(int legIndex) { this.legIndex = legIndex; }
public static LegNo getLeg(int legIndex) {
for (LegNo l : LegNo.values()) {
if (l.legIndex == legIndex) return l;
}
throw new IllegalArgumentException("Leg not found. Amputated?");
}
}
이제 정수로 Enum 값을 얻으려면 다음을 사용하십시오.
int myLegIndex = 1; //expected : LEG_ONE
LegNo myLeg = LegNo.getLeg(myLegIndex);
Java 8에 적용된 adarshr의 답변 :
import static java.util.Arrays.stream;
import static java.util.stream.Collectors.toMap;
import java.util.Map;
public enum LegNo {
NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);
private final int legNo;
private final static Map<Integer, LegNo> map =
stream(LegNo.values()).collect(toMap(leg -> leg.legNo, leg -> leg));
private LegNo(final int leg) {
legNo = leg;
}
public static LegNo valueOf(int legNo) {
return map.get(legNo);
}
}
enum LegNo에서 values () 메서드를 호출하여 주어진 정수 값에 해당하는 Enum 값에 액세스 할 수도 있습니다. LegNo 열거 형의 필드를 반환합니다. LegNo.values[0]; //returns LEG_NO LegNo.values[1]; //returns LEG_ONE LegNo.values[2]; //returns LEG_TWO
그가 찾던 것이 정확히는 아니지만 꽤 가깝고 실제로 매우 간단합니다. (피험자가 죽었지 만 다른 사람에게 유용 할 수 있습니다.)
기본값을 사용하는 Java 8 방식 :
public enum LegNo {
NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);
private final int legNo;
LegNo(int legNo) {
this.legNo = legNo;
}
public static LegNo find(int legNo, Supplier<? extends LegNo> byDef) {
return Arrays.asList(LegNo.values()).stream()
.filter(e -> e.legNo == legNo).findFirst().orElseGet(byDef);
}
}
전화하기 :
LegNo res = LegNo.find(0, () -> LegNo.NO_LEG);
또는 예외 :
LegNo res = LegNo.find(0, () -> {
throw new RuntimeException("No found");
});
Since your enum only contains 3 elements, the fastest way will be to just use a series of if else
, like you suggested.
edit: the answer that adarshr provided is better suited for general cases, where there are many enum values, but I think it is an overkill for your problem.
public enum LegNo {
NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);
private int legNo;
private LegNo(int leg) { legNo = leg; }
public static LegNo valueOf(int legNo) {
for (LegNo leg : LegNo.values()) {
if (leg.legNo == legNo) return leg;
}
}
}
assert LegNo.valueOf(2) == LegNo.LEG_TWO
assert LegNo.valueOf(3) == null
public enum body
{
NO_LEG = 0, // bit 1
LEG_ONE = 2, // bit 2
LEG_TWO = 4, // bit 3
NO_ARM = 8, // bit 4
ARM_ONE = 16, // bit 5
ARM_TWO = 32 // bit 6
}
use it like this (int)body.LEG_ONE ; /// which returns 2
this is also very fast, and easy readable since it is done on compile time.
참고URL : https://stackoverflow.com/questions/11047756/getting-enum-associated-with-int-value
'program tip' 카테고리의 다른 글
Unix-한 디렉토리의 내용을 다른 디렉토리로 복사 (0) | 2020.09.24 |
---|---|
C의`free`가 해제 할 바이트 수를 사용하지 않는 이유는 무엇입니까? (0) | 2020.09.24 |
쉘 스크립트를 사용하여 scp 파일 전송 자동화 (0) | 2020.09.24 |
neo4j 1.8에서 모든 노드 및 관계 삭제 (0) | 2020.09.23 |
창 가장자리와 관련하여 팝 오버의 X 위치를 기준으로 부트 스트랩 팝 오버의 위치를 변경 하시겠습니까? (0) | 2020.09.23 |