Javaのペアクラスの5つの選択肢

ペアは、2つのオブジェクトのタプルを格納するコンテナです。 Javaは実際にはPairクラスの実装を提供していません。 この記事では、JavaのPairクラスのさまざまな代替案について説明します。

ペアは、多くの場合、2つのオブジェクトを一緒に追跡するのに便利です。 これには、通常はfirstとsecondと呼ばれる2つのフィールドが含まれており、何かを格納することができます。 第一フィールドと第二フィールドの間に意味のある関係がないにもかかわらず、プログラマはJavaでこの機能を逃すことがよくあります。

前回の記事では、Javaで独自のPairクラスを実装する方法について説明しました。 この記事では、以下で説明するように、目的のギャップを埋めるためにJavaで利用可能な回避策について説明します。

Map。エントリ<K,V>インターフェイス

マップを使用できます。C++のstd::pairに似たJavaのエントリ<K,V>インターフェイス。 これは、キーと値のペアを表す意味のある名前を持つ優れた例です。

指定されたキーから指定された値へのマッピングを表すエントリを作成するために、Javaはマップの二つの具象実装を提供します。エントリインタフェース、すなわち、AbstractMap。SimpleEntryとAbstractMap。SimpleImmutableEntry。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

import java.util.AbstractMap;
javaをインポートします。ユーティルHashSet;
javaをインポートします。ユーティルMap;
javaをインポートします。ユーティルセット;
クラスペア
{
// 指定された値
public static<T,U>Mapからマップエントリ(キーと値のペア)を返します。エントリ<T,U>の(t first,U second)
{
新しいAbstractMapを返します。SimpleEntry<>(first,second);
}
}
クラス-タプル
{
// Mapを使用してJavaでPairクラスを実装します。エントリ
public static void main(String args)
{
<マップを設定します。Entry<String,Integer>>entries=新しいHashSet<>();
エントリー。追加(ペア。の(“Java”, 50));
エントリー。追加(ペア。の(”++”, 30));
システム。出ろprintln(エントリ);
// Java8以降では
エントリのみで実行されます。forEach(エントリ-> {
if(エントリ。getKey()。equals(“Java”))
システム。出ろprintln(エントリ.getValue());
});
}
}

ダウンロード実行コード

出力:

50

Java8-javafx.ユーティル最後に、長い待ち時間の後、javafxのJava8にPair<K,V>クラスが追加されます。utilパッケージ。 このクラスはキーと値のペアを表し、getKey()、getValue()、hashCode()、equals(javaなどの非常に基本的な操作をサポートしています。ラングオブジェクトo)およびtoString()であり、javaから継承されたメソッドはほとんどありません。ラングオブジェクトクラス。 まあ何かが何よりも優れている、ハァッ?.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

import javafx.util.Pair;
import java.util.ArrayList;
import java.util.List;
クラスタプル
{
// javafxをデモします。ユーティルJava8以降で導入されたペアクラス
public static void main(String args)
{
リスト<ペア<文字列、整数>>エントリ=新しいArrayList<>();
エントリー。add(新しいペア<>(“C”, 20));
エントリー。add(新しいペア<>(“C++”, 30));
// getKey()とgetValue()メソッド
システムを使用して最初のペアを印刷します。出ろprintln(“{“+エントリ。を取得(0)。ゲットキー() + “, ” +
エントリー。を取得(0)。getValue()+”}”);
//getKey()とgetValue()メソッドを使用して第二のペアを印刷します
システム。出ろprintln(“{“+エントリ。を取得(1)。ゲットキー() + “, ” +
エントリー。を取得(1)。getValue() + “}”);
}
}

ダウンロードコード

出力:
{C,20}
{C++, 30}

Apache Commons Lang Library

Apache Commons Lang Libraryは、要素が左右にあるペア<L,R>ユーティリティクラスも提供しています。 これは抽象として定義され、マップを実装します。キーが左にあり、値が右にある入力インターフェイス。

ペアを持っています。オブジェクトの指定されたペアからの不変のペアを取得するために使用することができるメソッドの()。 そのサブクラスMutablePairは可変ですが、ImmutablePairは不変です。 ただし、ImmutablePairに格納されているオブジェクトの型は、それ自体が変更可能である可能性があります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

orgをインポートします。アパッチコモンズlang3.タプルImmutablePair;
orgをインポートします。アパッチコモンズlang3.タプルMutablePair;
orgをインポートします。アパッチコモンズlang3.タプルPair;
javaをインポートします。ユーティルArrayList;
javaをインポートします。ユーティルリスト;
クラスタプル
{
// JavaでApache Commonsライブラリを提供するペアクラスを実証
public static void main(String args)
{
リスト<ペア<文字列、整数>>エントリ=新しいArrayList<>();
エントリー。add(new MutablePair<>(“C”,20));//MutablePair
エントリを使用します。add(new ImmutablePair<>(“C++”,30));//ImmutablePair
エントリを使用します。追加(ペア。の(“Java”,50));//ペアを使用しています。()
システムの。出ろprintln(エントリ);
// 1. first pair is mutable
Pair<String, Integer> pair = entries.get(0);
pair.setValue(100); // works fine
// printing pair using getKey() and getValue() method
System.out.println(pair.getKey() + “, ” + pair.getValue());
// 2. second pair is immutable
pair = entries.get(1);
try {
pair.setValue(100); // runtime error
}
catch (UnsupportedOperationException ex) {
System.out.println(“UnsupportedOperationException thrown”);
}
// getLeft()とgetRight()メソッド
システムを使用してペアを印刷します。出ろprintln(ペア。getLeft()+”,”+ペア。ゲットライト());
// 3. 3番目のペアも不変
pair=entriesです。取得(2);
{
ペアを試してみてください。setValue(100);//ランタイムエラー
}
catch(U N S U Pportedoperationexception ex){
システム。出ろprintln(“U N S U Pportedoperationexceptionがスローされました”);
}
システム。出ろprintln(ペア。getLeft()+”,”+ペア。getRight());
}
}

ダウンロードコード

出力:

C、100
U N S U Pportedoperationexceptionスロー
C++、30
u N S U Pportedoperationexceptionスロー
Java, 50

Javatuplesライブラリ

Javatuplesは、タプルを扱う別の有名でシンプルなjavaライブラリです。 これは、1つから10個の要素の範囲のタプルjavaクラスのセットを提供します。 私たちの目的を果たすために、Pair<A,B>classを使用できます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

orgをインポートします。javatuples。Pair;
javaをインポートします。ユーティルArrayList;
javaをインポートします。ユーティルリスト;
クラスタプル
{
// Java
public static void main(String args)でJavaTuplesライブラリを提供するペアクラスを示します)
{
リスト<ペア<文字列、整数>>ペア=新しいArrayList<>();
ペア。追加(ペア。with(“Java”,50));//ペアを使用しています。()
のペアを使用します。add(new Pair<>(“C++”,30));//コンストラクタを使用して
//getvalue0()とgetvalue1()メソッドを使用して最初のペアを印刷します
System.出ろprintln(“{“+ペア。を取得(0)。getvalue0() + “, ” +
ペア。を取得(0)。getvalue1() + “}”);
// getvalue0()とgetvalue1()メソッド
システムを使用して第二のペアを印刷します。出ろprintln(“{“+ペア。を取得(1)。getvalue0() + “, ” +
ペア。を取得(1)。getvalue1() + “}”);
}
}

ダウンロードコード

出力:
{Java,50}
{C++, 30}

コレクション。singletonMap()

別のアプローチは、コレクションを使用することです。JavaのsingletonMap()はMapに似ています。エントリ<K,V>前に説明しました。 これは、指定されたキーと値のペアのマッピングのみを含む不変のシングルトンマップを返します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
javaをインポートします。ユーティルセット;
クラスペア
{
// 指定された
のみを含む不変のシングルトンマップを返す//キーと値のペアマッピング
public static<T,U>Map<T,u>of(t first,U second)
{
コレクションを返す。singletonMap(第一、第二);
}
}
クラス-タプル
{
// Collectionsを使用してJavaでPairクラスを実装します。singletonMap()
public static void main(String args)
{
Set<Map<String,Integer>>entries=new HashSet<>();
エントリー。追加(ペア。の(“Java”, 50));
エントリー。追加(ペア。の(”++”, 30));
システム。出ろprintln(エントリ);
}
}

ダウンロード実行コード

出力:

最後に、Androidプロジェクトでは、androidを使用できます。ユーティルAndroid SDKによって提供されるペアクラス。