programing

값 쌍의 Java 컬렉션?(튜플이요?)

prostudy 2022. 4. 23. 10:25
반응형

값 쌍의 Java 컬렉션?(튜플이요?)

예를 들어, Java가 맵에서 각 항목의 유형을 정의할 수 있는 맵을 가지고 있는 방법이 마음에 들어.<String, Integer>.

내가 찾고 있는 것은 수집의 한 종류인데, 수집의 각 요소는 한 쌍의 값이다.쌍의 각 값은 선언 시간에 정의되는 고유한 유형(위의 문자열 및 정수 예제)을 가질 수 있다.

컬렉션은 지정된 순서를 유지하며 값 중 하나를 (지도에서처럼) 고유 키로 처리하지 않는다.

는 ALLERA의 .<String,Integer>또는 다른 2가지 유형.

2가지 변수밖에 없는 수업을 만들 수 있다는 건 알지만 너무 장황한 것 같아.

또한 2D 어레이를 사용할 수 있다는 것도 알고 있지만, 사용해야 하는 유형이 다르기 때문에 Object 어레이로 만들어야 하고, 그 다음엔 항상 캐스팅을 해야 한다.

컬렉션에 쌍만 저장하면 되니까 한 항목당 두 개의 값만 있으면 돼.수업 루트를 안 가고 이런 게 존재하는 거야?고마워!

추상 지도.심플엔트리

쉽게 찾을 수 있는 기능:

java.util.List<java.util.Map.Entry<String,Integer>> pairList= new java.util.ArrayList<>();

어떻게 채울 수 있어?

java.util.Map.Entry<String,Integer> pair1=new java.util.AbstractMap.SimpleEntry<>("Not Unique key1",1);
java.util.Map.Entry<String,Integer> pair2=new java.util.AbstractMap.SimpleEntry<>("Not Unique key2",2);
pairList.add(pair1);
pairList.add(pair2);

이를 통해 다음과 같은 이점을 얻을 수 있다.

Entry<String,Integer> pair1=new SimpleEntry<>("Not Unique key1",1);
Entry<String,Integer> pair2=new SimpleEntry<>("Not Unique key2",2);
pairList.add(pair1);
pairList.add(pair2);

그리고, A의 도움으로createEntrymethod는 다음과 같이 장황하게 말할 수 있다.

pairList.add(createEntry("Not Unique key1", 1));
pairList.add(createEntry("Not Unique key2", 2));

이후ArrayList최종적인 것이 아니라, 그것을 노출시키기 위해 하위 분류될 수 있다.of방법(그리고 앞에서 말한 것)createEntrymethod), 그 결과 구문론적으로 다음과 같이 된다.

TupleList<java.util.Map.Entry<String,Integer>> pair = new TupleList<>();
pair.of("Not Unique key1", 1);
pair.of("Not Unique key2", 2);

페어 클래스는 스스로 쓸 수 있을 만큼 쉬운 "gimme" 제네릭 예제 중 하나이다.예를 들어, 내 머리 위에서부터:

public class Pair<L,R> {

  private final L left;
  private final R right;

  public Pair(L left, R right) {
    assert left != null;
    assert right != null;

    this.left = left;
    this.right = right;
  }

  public L getLeft() { return left; }
  public R getRight() { return right; }

  @Override
  public int hashCode() { return left.hashCode() ^ right.hashCode(); }

  @Override
  public boolean equals(Object o) {
    if (!(o instanceof Pair)) return false;
    Pair pairo = (Pair) o;
    return this.left.equals(pairo.getLeft()) &&
           this.right.equals(pairo.getRight());
  }

}

그리고 네, 이것은 인터넷 상의 여러 곳에 존재하며, 다양한 수준의 완전성과 특징을 가지고 있다.(위의 나의 예는 불변성을 의도한 것이다.)

자바 9+

Java 9에서는 불변의 쌍을 만들기 위해 간단히 쓸 수 있다.

참고: 이 방법은 키나 값을 null로 허용하지 않는다.예를 들어, null 값을 허용하려면 다음을 변경하십시오.Map.entry(key, Optional.ofNullable(value)).


자바 8+

Java 8에서는 보다 범용성을 사용하여 불변하고 직렬화할 수 있는 쌍을 만들 수 있다.이 클래스는 null 키와 null 값을 허용한다.(Java 9에서 이 클래스는javafx.base모듈(module.편집: Java 11의 JavaFX는 JDK에서 분리되었으므로 추가 maven 아티팩트 org.openjfx:javafx-base가 필요할 것이다.


자바 6+

Java 6 이상에서는 불변 쌍 또는 값을 변경할 수 있는 쌍에 대해 보다 자세한 설명을 사용할 수 있다.이러한 클래스는 null 키와 null 값도 허용하며 직렬화할 수 있다.


안드로이드

Android용으로 글을 쓰는 경우 를 사용하여 불변의 쌍을 만드십시오.


아파치 커먼스

Apache Commons Lang 불변하고 비교할 수 있는 연속 가능한 쌍을 만드는 데 도움이 된다.


이클립스 컬렉션

원시 요소를 포함하는 쌍을 사용하는 경우 Eclipse Collections는 매우 효율적인 원시 쌍 클래스를 제공하여 비효율적인 자동 복싱 및 자동 복싱을 모두 방지하십시오.

예를 들어, 을(를) 생성하거나 을(를) 생성하기 위해 사용할 수 있다.


수작업 방식의 구현

Java 16의 레코드는 미리 보기 상태에서 나왔으므로 이제 다음을 수행할 수 있다.

public record Pair<K, V>(K key, V value) {
    public static <K, V> Pair<K, V> of(K key, V value) {
        return new Pair<>(key, value);
    }
}

위의 구현은 기록적인 탈구축을 가능하게 하기 때문에 미래에 큰 이점을 가질 것이다.

Java 16 이전에 Project Lombok과 동일한 의미론을 얻을 수 있다.

@Value(staticConstructor = "of")
public class Pair<K, V> {
    K key;
    V value;
}

과 같은 , Guards)가 있다.예외 및 강력한 기능hashCode()기록과1 동일한 구현:

import java.util.Objects;

public class Pair<K, V> {

    public final K key;
    public final V value;

    private Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public static <K, V> Pair<K, V> of(K key, V value) {
        return new Pair<>(key, value);
    }

    public boolean equals(Object o) {
        return o instanceof Pair && Objects.equals(key, ((Pair<?,?>)o).key) && Objects.equals(value, ((Pair<?,?>)o).value);
    }

    public int hashCode() {
        return 31 * Objects.hashCode(key) + Objects.hashCode(value);
    }

    public String toString() {
        return key + "=" + value;
    }
}

1 OpenJDK 17에서 테스트됨

Map.Entry

이러한 기본 제공 클래스도 옵션이다.둘 다 인터페이스를 구현한다.

지도에 대한 UML 도표.

Apache common lang3에는 Pair 클래스가 있고 이 스레드에서 언급된 다른 라이브러리가 거의 없음 자바에서 C++ Pair와 동등한 것은 무엇인가?

원래 질문의 요구 사항과 일치하는 예:

List<Pair<String, Integer>> myPairs = new ArrayList<Pair<String, Integer>>();
myPairs.add(Pair.of("val1", 11));
myPairs.add(Pair.of("val2", 17));

//...

for(Pair<String, Integer> pair : myPairs) {
  //following two lines are equivalent... whichever is easier for you...
  System.out.println(pair.getLeft() + ": " + pair.getRight());
  System.out.println(pair.getKey() + ": " + pair.getValue());
}

Android용 개발자는 누구나 Android.util을 사용할 수 있다. :)

"Apache Commons Lang 3" 은 ?Pair계급과 상대적인 하위 계급은?

    import org.apache.commons.lang3.tuple.ImmutablePair;
    import org.apache.commons.lang3.tuple.Pair;
    ...
    @SuppressWarnings("unchecked")
    Pair<String, Integer>[] arr = new ImmutablePair[]{
            ImmutablePair.of("A", 1),
            ImmutablePair.of("B", 2)};

    // both access the 'left' part
    String key = arr[0].getKey();
    String left = arr[0].getLeft();

    // both access the 'right' part
    Integer value = arr[0].getValue();
    Integer right = arr[0].getRight();

ImmutablePair페어의 값을 수정할 수 없는 특정 하위 클래스지만 다른 의미론적 구현이 있다.필요하면 메이븐 좌표야

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>

일반 Pair[A] 클래스를 작성하여 배열 또는 목록에 사용하십시오.응, 수업은 작성해야 하는데, 모든 종류에 대해 같은 수업을 재사용할 수 있어서 한 번만 하면 돼.

다른 응답으로 확장하는 일반 불변의 쌍은 생성자에 대한 호출로 코드를 혼동하지 않도록 정적 방법을 사용해야 한다.

class Pair<L,R> {
      final L left;
      final R right;

      public Pair(L left, R right) {
        this.left = left;
        this.right = right;
      }

      static <L,R> Pair<L,R> of(L left, R right){
          return new Pair<L,R>(left, right);
      }
}

정적 메서드의 이름을 "of" 또는 "pairOf"로 지정하면 다음 중 하나를 쓸 수 있으므로 코드가 유창해진다.

    list.add(Pair.of(x,y)); // my preference
    list.add(pairOf(x,y)); // use with import static x.y.Pair.pairOf

핵심 자바 도서관이 그러한 것들에 너무 희박해서 당신은 그러한 기본적인 것들을 하기 위해 공유자-공유자 또는 다른 제3자를 사용해야 한다는 것은 정말 부끄러운 일이다.스칼라로 업그레이드해야 하는 또 다른 이유...

설명한 대로 선호하는 해결책은 쌍 목록(예: 목록)이다.

이렇게 하려면 컬렉션에 사용할 페어 클래스를 만드십시오.이 클래스는 코드 베이스에 추가할 수 있는 유용한 유틸리티 클래스 입니다.

일반적인 페어 클래스와 유사한 기능을 제공하는 Sun JDK에서 가장 가까운 클래스는 ObstractractMap이다.심플엔트리여러분만의 페어 클래스를 만드는 것보다 이 클래스를 사용할 수 있다. 비록 여러분은 어색한 제약을 감수하고 살아야 할 것이고, 대부분의 사람들은 SimpleEntry의 의도된 역할이 아니라고 눈살을 찌푸릴 것이다.예를 들어 SimpleEntry에는 "setKey()" 방법이 없고 기본 생성자가 없으므로 너무 제한적이라고 생각할 수 있다.

컬렉션은 단일 유형의 요소를 포함하도록 설계되어 있음을 명심하십시오.Map과 같은 관련 유틸리티 인터페이스는 실제로 Collection이 아니다(즉, Map은 Collection 인터페이스를 구현하지 않는다).쌍은 수집 인터페이스도 구현하지 않지만, 분명 더 큰 데이터 구조를 구축하는 데 유용한 클래스다.

나는 당신이 단지 a를 사용하고 싶지 않은지 물어보려고 했다.List<Pair<T, U>>물론 JDK에는 페어 클래스가 없다.그러나 빠른 구글은 위키피디아와 포럼 모두에서 하나를 발견했다.sun.com.건배.

자바 14+ 에디션

다음을 생성할 수 있다.record어떤 도구들이equals,hashCode그리고toString개봉하여다음과 같은 인터페이스Comparable필요할 경우 구현될 수 있다.

record Pair<A, B>(A first, B second) {}

기록은 불변의 것이다.

이것은 JavaHelp4u의 코드를 기반으로 한다.

장황하지 않고 한 줄로 하는 방법과 사물을 반복하는 방법을 보여준다.

//======>  Imports
import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;

//======>  Single Entry
SimpleEntry<String, String> myEntry = new SimpleEntry<String, String>("ID", "Text");
System.out.println("key: " + myEntry.getKey() + "    value:" + myEntry.getValue());
System.out.println();

//======>  List of Entries
List<Entry<String,String>> pairList = new ArrayList<>();

//-- Specify manually
Entry<String,String> firstButton = new SimpleEntry<String, String>("Red ", "Way out");
pairList.add(firstButton);

//-- one liner:
pairList.add(new SimpleEntry<String,String>("Gray", "Alternate route"));  //Ananomous add.

//-- Iterate over Entry array:
for (Entry<String, String> entr : pairList) {
    System.out.println("Button: " + entr.getKey() + "    Label: " + entr.getValue());
}

Spring은 Data Utils 패키지에 포함되어 있음

Pair<String,Integer> pair = Pair.of("Test", 123);
System.out.println(pair.getFirst());
System.out.println(pair.getSecond());

아파치 크런치 또한Pair클래스: http://crunch.apache.org/apidocs/0.5.0/org/apache/crunch/Pair.html

내 말은, 비록 아무것도 없지만Pair 것이 자바의 수정이 있다.Map.Entry

Map.Entry 설명서

이것은 (대부분 단순화) 무엇이다.HashMap, 또는 실제로 어떤 것Map상점들

의 인스턴스를 만들 수 있다.Map값을 저장한 후 입력 세트를 가져오십시오.당신은 결국 a로 끝날 것이다.Set<Map.Entry<K,V>>그게 바로 네가 원하는 거야

자:

public static void main(String []args)
{    
    HashMap<String, Integer> values = new HashMap<String,Integer>();
    values.put("A", 235);//your custom data, the types may be different
    //more data insertions....
    Set<Map.Entry<String,Integer>> list = values.entrySet();//your list 
    //do as you may with it
}

그냥 같은 반을 만들어라.

class Tuples 
{ 
    int x;
    int y;
} 

이 튜플 객체 리스트 작성

List<Tuples> list = new ArrayList<>();

따라서 다른 새로운 데이터 구조도 동일한 방식으로 구현할 수 있다.

com.sun.tools.javac.util.pair는?

키/값 쌍에 대해 이야기할 때 가장 먼저 생각하는 것은 스트림/파일에 항목을 저장하고 로드할 수 있는 Properties Class이다.

프로젝트 원자로(io.projectreactor:reactor-core)에서는 n-Tuple에 대한 사전 지원이 있다.

Tuple2<String, Integer> t = Tuples.of("string", 1)

거기서 너는 얻을 수 있다.t.getT1(), t.getT2(), ...특히 Stream(스트림) 또는 Flus(플럭스)를 사용하면 튜플 요소:

Stream<Tuple2<String, Integer>> s;
s.map(t -> t.mapT2(i -> i + 2));

참조URL: https://stackoverflow.com/questions/521171/a-java-collection-of-value-pairs-tuples

반응형