Programing

Java에서 쌍 또는 2-tule 사용

c10106 2022. 4. 14. 21:29
반응형

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:

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

이러한 논의는 "이 상황에 직면할 때마다 특정 이름을 가진 클래스 투플을 다시 사용하거나 특정 이름을 가진 새로운 클래스를 만들어야 한다"라는 매직 대 콜린D 접근법을 반영하기 위해 계속된다.몇 년 전 나는 후기 진영에 있었다. 나는 전자를 지지하도록 진화했다.

lombok은 쉽게 선언할 수 있다.Pair클래스:

@Data(staticConstructor = "of")
public class Pair<A, B> {
    private final A left;
    private final B right;
}

그러면 게이터, 정적 생성자 "of"가 생성되고equals(),hashcode()그리고toString().

자세한 내용은 설명서를 참조하십시오.

Android Tuple Utils

이 개체는 포함된 각 개체가 참이면 참()으로 반환되는 등가()의 합리적인 구현을 제공한다.

실제로 모델링하고 있는 개념을 설명하는 클래스를 만들어 사용하십시오.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

반응형