값 쌍의 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의 도움으로createEntry
method는 다음과 같이 장황하게 말할 수 있다.
pairList.add(createEntry("Not Unique key1", 1));
pairList.add(createEntry("Not Unique key2", 2));
이후ArrayList
최종적인 것이 아니라, 그것을 노출시키기 위해 하위 분류될 수 있다.of
방법(그리고 앞에서 말한 것)createEntry
method), 그 결과 구문론적으로 다음과 같이 된다.
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
이러한 기본 제공 클래스도 옵션이다.둘 다 인터페이스를 구현한다.
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
이것은 (대부분 단순화) 무엇이다.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
'programing' 카테고리의 다른 글
Vue.js 계산 함수에서 다중 차원 배열 필터링 (0) | 2022.04.23 |
---|---|
왜 정적으로 연결된 glibc가 낙담하는가? (0) | 2022.04.23 |
Vuejs는 이것을 타이프로 표현한다.$refs..값이 존재하지 않음 (0) | 2022.04.23 |
최대 절전 모드 사용 시 매개 변수 값으로 쿼리 문자열을 인쇄하는 방법 (0) | 2022.04.23 |
작성 및 읽기 작업에 동일한 양식을 사용 (0) | 2022.04.23 |