2012-06-23 4 views
-1

배열을 HashMap의 키로 사용하려고합니다. 배열의 길이는 2이므로 본질적으로 2- 튜플의 역할을합니다. 사용자 정의 2 튜플 클래스를 구현하는 것은 매우 최후의 수단입니다. 문제는, 같은 내용의 맵을 가진 배열이 HashMap의 서로 다른 위치에 다른 위치에 있으면 좋겠다. Arrays.hashCode 및 Arrays.deepHashCode에 hashCode 함수가 있다는 것을 알고 있지만 HashMap에 사용할 수있는 방법이 있습니다. 이미 말했듯이, 나는 정말로 내 자신의 튜플 클래스를 구현하고 싶지 않다.배열을 해시 맵 키로 사용

+0

얼마 전에 거의 동일한 문제가 발생하여 포기했습니다. 원시 배열의 해싱 동작을 변경할 수 있다고는 생각하지 않습니다. 이 경우, 새로운'SerializableTuple' 클래스를 소개 할 수 있습니다. – Gene

답변

0

좋아 해결책을 찾았습니다. 배열 대신에 List를 사용했습니다. 이것은 List가 참조가 아닌 내용별로 동등성을 결정하기 때문에 가능합니다.

3

나는 이 아닙니다.은이 방법을 권장합니다.

키는 변경 가능해야합니다. 배열을 그렇게 만들지 않는다면 위험이 따르게 될 것입니다.

Java는 객체 지향 언어입니다. 나는 프리미티브 측면에서 너무 많이 생각하는 것이 실수라고 생각한다. 객체에 필요한 적절한 동작을 캡슐화합니다.

왜 자신 만의 수업을 만드는 것이 그렇게 억울한가요? 최후의 조치? 이것이 왜 그렇게 큰 이유인지 이해할 수 없습니다. 그것을 창조하고, 불변으로 만들고, 명확하게 당신의 의도를 문서화하고 계속 나아 간다.

업데이트 : 당신이 이미 결함있는 튜플 클래스를 가지고 있다는 사실로 인해이 경우에 올바른 일을하지 못하게 할 수는 없습니다. 당신은 "수백 개의 수업"을 가지고 있다고 말합니다 - 나는 하나 더 옳은 일을하는 것이 당신을 해치지 않을 것이라고 말합니다. 코드는 당신이하려고하는 것과 같은 "실용적인"나쁜 결정의 축적을 통해 혼란에 빠지게됩니다. 이 협소 한 문제에 대한 올바른 해결책을 만들어 벼락치기에 더해지기를 결단하고 거기에서 더 나은 대답으로 나가는 길을 시작하십시오.

+0

우리는 이미 튜플 구현을 가지고 있지만 serializer로 직렬화 할 수 없으며이 정보를 직렬화해야합니다. 저는 기능을 복제하지 않을 것이며, 튜플 구현은 수백 개의 클래스에 걸쳐있는 우리 프로젝트의 주요 데이터 구조 중 하나입니다. – Max

+0

올바른 해결책은 그것을 빨아 들이고 새로운'Pair' 클래스를 작성하는 것입니다. 더 나은 이름과 특정 필드 이름을 가진 클래스를 작성하는 것이 더 좋습니다. 다른 요소가 다른 의미를 가질 때 배열을 사용해서는 안됩니다. 'Arrays.equals' 또는'Arrays.hashCode'를 여기에 사용하는 방법이 있더라도 새로운 클래스를 작성하는 것은 명확한 해결책이 될 것입니다. –

+1

@Max - 간단한 해결책은 기존 (불변) 튜플 유형을 직렬화 가능하게 변경하는 것입니다. 그게 위험한거야? 튜플 클래스를 직렬화하는 것은 튜플을 직렬화하려고하지 않는 기존 코드를 깨뜨릴 수 없습니다. –

1

문제는 다른 메모리 위치가있는 경우 HashMap의 다른 위치에 동일한 컨텐츠 맵을 가진 배열을 배치하고 싶습니다.

만약 내용 배열의 다른 메모리 위치가있는 경우 서로 다른 메모리 위치를, 또는배열? 이전 버전 인 경우 보통 HashMap 대신 IdentityHashMap을 사용할 수 있습니다. 그러나 후자의 경우 @ duffymo의 답변에 동의합니다 : grow a pair;)