IT

Java에서 쌍 또는 2 개의 튜플 사용

lottoking 2020. 3. 20. 08:31
반응형

Java에서 쌍 또는 2 개의 튜플 사용 [중복]


이 질문에는 이미 답변이 있습니다.

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 CommonsPair를 포함하여 몇 가지 일반적인 Java 유틸리티를 제공했습니다 . 그것은 구현 Map.Entry, ComparableSerializable.


내장 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, hashmaerics의 암시 그것에는 :

http://groups.google.com/group/comp.lang.java.help/browse_thread/thread/f8b63fc645c1b487/1d94be050cfc249b

그 논의는 "특별한 이름을 가진 클래스 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

반응형