Java에서 쌍 또는 2 개의 튜플 사용 [중복]
이 질문에는 이미 답변이 있습니다.
- Java 값 쌍 모음? (튜플?) 19 답변
Java의 내 Hashtable은 튜플 구조를 가진 값에서 이점을 얻습니다. Java에서 어떤 데이터 구조를 사용하여 그렇게 할 수 있습니까?
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;
}
}
물론, 특히 인스턴스를 해싱의 키로 사용하려는 경우 등식, 불변성 등과 관련하여이 클래스를 디자인하는 방법에 중요한 영향을 미칩니다.
javatuples 는 Java 튜플 전용 프로젝트입니다.
Unit<A> (1 element)
Pair<A,B> (2 elements)
Triplet<A,B,C> (3 elements)
Apache Commons 는 Pair를 포함하여 몇 가지 일반적인 Java 유틸리티를 제공했습니다 . 그것은 구현 Map.Entry
, Comparable
및 Serializable
.
내장 Java 2 요소 튜플을 찾고 있다면을 시도하십시오 AbstractMap.SimpleEntry
.
@maerics nice answer의 확장으로 몇 가지 유용한 방법을 추가했습니다.
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 센트 : Java 7부터는 표준 Lib에 javafx.util.Pair 클래스가 있습니다.
그리고 그렇습니다. 표준 Java입니다. 이제 JavaFx가 JDK에 포함되었습니다. :)
여기에보다 강력한 포함 곳이 똑같은 질문이다 equals
, hash
maerics의 암시 그것에는 :
그 논의는 "특별한 이름을 가진 클래스 Tuple을 재사용하거나이 상황이 발생할 때마다 특정 이름을 가진 새로운 클래스를 만들어야합니까"라는 매 릭스 대 ColinD 접근 방식을 반영하기 위해 계속됩니다. 몇 년 전 저는 후자 캠프에있었습니다. 나는 전자를 지원하도록 진화했다.
롬복 을 사용하면 Pair
클래스를 쉽게 선언 할 수 있습니다 .
@Data(staticConstructor = "of")
public class Pair<A, B> {
private final A left;
private final B right;
}
그러면 "of" equals()
, hashcode()
및 이라는 정적 생성자 인 getter가 생성됩니다 toString()
.
@Data
자세한 내용 은 설명서를 참조하십시오
이 객체는 포함 된 각 객체에서 equals ()가 true이면 true를 반환하는 equals ()의 현명한 구현을 제공합니다.
실제로 모델링하는 개념을 설명하는 클래스를 작성하고 사용하십시오. 두 개만 저장 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;
}
}
기사는 이제 꽤 오래지만 내가 정말 도움이 아니에요 이해하지만, 그리고, 나는 일이 여기에 다 생각 : http://www.pds.ewi.tudelft.nl/pubs/papers/cpe2005.pdf , 주류 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);
튜플은 다음과 같습니다.
- 기본 유형으로 정의-템플릿 / 일반 없음
- 로컬로 선언 된 경우 스택 할당
- 패턴 일치를 사용하여 할당
이 접근법은 증가
- 공연
- 가독성
- 표현력
Java 튜플에 대한 일반적인 관점에서 시작하여 구체적인 문제에 대한 함의로 마무리합니다.
1) 튜플이 제네릭이 아닌 언어에서 사용되는 방식은 형식이 안전하지 않기 때문에 Java에서는 피합니다 (예 : Python :) 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
'IT' 카테고리의 다른 글
main이 유효한 Java 식별자입니까? (0) | 2020.03.20 |
---|---|
'ImportError : 가져올 수없는 이름 IncompleteRead'는 어떻게 수정합니까? (0) | 2020.03.20 |
JavaScript 함수가 정의되어 있는지 확인하는 방법 (0) | 2020.03.20 |
동일한 그래프에서 ggplot2를 사용하여 두 변수를 선으로 플로팅 (0) | 2020.03.20 |
Gson : String을 JsonObject로 직접 변환 (POJO 없음) (0) | 2020.03.20 |