Java에서 쌍 또는 2-tule 사용
자바에 있는 나의 해시테이블은 튜플 구조를 가진 값에서 이익을 얻을 것이다.자바에서는 어떤 데이터 구조를 사용하여 이를 수행할 수 있는가?
Hashtable<Long, Tuple<Set<Long>,Set<Long>>> table = ...
나는 Java에 범용 튜플 수업이 없다고 생각하지만, 맞춤 수업은 다음과 같이 쉬울 수 있다.
public class Tuple<X, Y> {
public final X x;
public final Y y;
public Tuple(X x, Y y) {
this.x = x;
this.y = y;
}
}
물론, 특히 해싱의 키로 인스턴스를 사용할 계획인 경우 평등성, 불변성 등과 관련하여 이 클래스를 어떻게 더 설계할 것인가에 대한 몇 가지 중요한 의미가 있다.
자바투플은 자바에서 튜플을 위한 전용 프로젝트다.
Unit<A> (1 element)
Pair<A,B> (2 elements)
Triplet<A,B,C> (3 elements)
아파치 커먼스는 페어를 포함한 몇 가지 일반적인 자바 유틸리티를 제공했다.그것은 구현한다.Map.Entry
,Comparable
그리고Serializable
.
기본 제공 Java 2-Element 튜플을 찾으려면AbstractMap.SimpleEntry
.
@maerics 멋진 대답의 연장선으로서 몇 가지 유용한 방법을 추가했다.
public class Tuple<X, Y> {
public final X x;
public final Y y;
public Tuple(X x, Y y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "(" + x + "," + y + ")";
}
@Override
public boolean equals(Object other) {
if (other == this) {
return true;
}
if (!(other instanceof Tuple)){
return false;
}
Tuple<X,Y> other_ = (Tuple<X,Y>) other;
// this may cause NPE if nulls are valid values for x or y. The logic may be improved to handle nulls properly, if needed.
return other_.x.equals(this.x) && other_.y.equals(this.y);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((x == null) ? 0 : x.hashCode());
result = prime * result + ((y == null) ? 0 : y.hashCode());
return result;
}
}
또 다른 2센트: 자바 7에서 시작하여, 이제 표준 Lib : 자바프x.util에 이에 대한 클래스가 있다.짝을
그리고 예, JavaFx가 JDK에 포함되어 있으므로 표준 Java 입니다 :)
여기 다른 곳에서도 똑같은 질문이 있는데, 여기에는 좀 더 강력한 질문이 포함된다.equals
,hash
다음을 암시하는 mererics:
이러한 논의는 "이 상황에 직면할 때마다 특정 이름을 가진 클래스 투플을 다시 사용하거나 특정 이름을 가진 새로운 클래스를 만들어야 한다"라는 매직 대 콜린D 접근법을 반영하기 위해 계속된다.몇 년 전 나는 후기 진영에 있었다. 나는 전자를 지지하도록 진화했다.
lombok은 쉽게 선언할 수 있다.Pair
클래스:
@Data(staticConstructor = "of")
public class Pair<A, B> {
private final A left;
private final B right;
}
그러면 게이터, 정적 생성자 "of"가 생성되고equals()
,hashcode()
그리고toString()
.
자세한 내용은 설명서를 참조하십시오.
이 개체는 포함된 각 개체가 참이면 참()으로 반환되는 등가()의 합리적인 구현을 제공한다.
실제로 모델링하고 있는 개념을 설명하는 클래스를 만들어 사용하십시오.2개만 저장할 수 있다.Set<Long>
접근자를 제공하되, 각 세트가 정확히 무엇이며 왜 함께 그룹화되었는지 표시하기 위해 이름을 지정해야 한다.
@maerics의 대답을 보충하기 위해, 여기 그 답이 있다.Comparable
튜플:
import java.util.*;
/**
* A tuple of two classes that implement Comparable
*/
public class ComparableTuple<X extends Comparable<? super X>, Y extends Comparable<? super Y>>
extends Tuple<X, Y>
implements Comparable<ComparableTuple<X, Y>>
{
public ComparableTuple(X x, Y y) {
super(x, y);
}
/**
* Implements lexicographic order
*/
public int compareTo(ComparableTuple<X, Y> other) {
int d = this.x.compareTo(other.x);
if (d == 0)
return this.y.compareTo(other.y);
return d;
}
}
비록 그 기사가 지금은 꽤 오래되었고, 내가 별로 도움이 되지 않는다는 것을 이해하지만, 나는 Java에 튜플 추가: 경량 데이터 구조에 관한 연구에서 설명한 제안이 Java 주류에서 좋았을 것이라고 생각한다.
다음과 같은 작업을 수행할 수 있다.
int a;
char b;
float c;
[a,b,c] = [3,'a',2.33];
또는
[int,int,char] x = [1,2,'a'];
또는
public [int,boolean] Find(int i)
{
int idx = FindInArray(A,i);
return [idx,idx>=0];
}
[idx, found] = Find(7);
여기서 튜플은 다음과 같다.
- 원시 유형으로 정의됨 - 템플릿/세대 없음
- 스택 로컬로 선언된 경우 할당됨
- 패턴 매칭을 사용하여 할당됨
이 접근법은 증가한다.
- 퍼포먼스
- 가독성
- 표현력
Google Guava 테이블을 사용할 수 있음
나는 자바에서의 튜플에 대한 일반적인 관점에서 시작해서 당신의 구체적인 문제에 대한 암시로 끝낼 것이다.
1) 튜플을 일반어가 아닌 언어로 사용하는 방법은 타입-세이프가 아니기 때문에 자바에서는 피한다)가 아니기 때문에 자바에서는 피한다.tuple = (4, 7.9, 'python')
. 범용 튜플(권장되지 않음)과 같은 것을 여전히 사용하려는 경우, 다음을 사용하십시오.Object[]
또는List<Object>
그리고 체크 후에 요소들을 던진다.instanceof
형식 안전을 보장하다
일반적으로, 특정 환경에서 튜플은 항상 동일한 구조를 포함하는 동일한 방식으로 사용된다.Java에서는 이 구조를 에서 명시적으로 정의해야 한다.class
잘 정의된 안전한 값과 방법을 제공하십시오.이것은 처음에는 짜증나고 군더더기처럼 보이지만, 컴파일 시간에 이미 오류를 방지한다.
2) 같은 (초급) 등급의 튜플이 필요한 경우Foo
사용하다Foo[]
List<Foo>
또는List<? extends Foo>
(이튜플은 정의된 길이가 아니기 때문에 이 용액은 동등하다.
3) 당신같은 경우에는..Pair
(즉, 길이 2의 잘 정의된 튜플).이것은 미래에 코드를 재사용할 수 있기 때문에 마법사의 대답이나 보충적인 대답 중 하나를 가장 효율적으로 만든다.
참조URL: https://stackoverflow.com/questions/2670982/using-pairs-or-2-tuples-in-java
'Programing' 카테고리의 다른 글
Vuex store getter는 항상 false를 반환함 (0) | 2022.04.14 |
---|---|
내가 받은 구성 요소에 "프로포즈"를 추가하자 마자: 감시자 "기능" (){ 이것을 반환한다._data.$$state }" (0) | 2022.04.14 |
mapState의 Vue 계산 구문 오류 (0) | 2022.04.14 |
Vuetifyjs 2.0 테마는 관찰자에 따라 변경되지 않음 (0) | 2022.04.13 |
Java가 운영자에게 과부하를 제공하지 않는 이유는? (0) | 2022.04.13 |