在此Java 元组教程中,我们将了解元组——一种通用数据结构,以及我们如何在Java 程序中使用元组。默认情况下,元组不是作为数据结构的 Java 编程语言的一部分,因此我们将使用一个不错的第三方库 javatuples 为它。
元组可以看作是不同类型对象的有序集合。这些对象不一定以任何方式相互关联,但它们共同具有一定的意义。
例如,["Sajal Chakraborty," "IT Professional," 32]
可以是一个元组,其中元组中的每个值都没有任何关系,但是这整组值在应用程序。例如,give 元组可能表示具有姓名、部门和年龄的员工数据。
让我们看一些更多的 java 元组示例。
["Java", 1.8, "Windows"]
["Alex", 32, "New York", true]
[3, "Alexa", "howtodoinjava.com", 37000]
Java 没有任何此类内置数据结构来支持元组。无论何时需要,我们都可以创建一个可以像元组一样工作的类。
此外,在 Java 中,部分元组功能可以使用 List
或 Array
编写,但这些不允许我们在设计上保存不同类型的数据类型。所以我们可以说使用标准数据结构的异构元组在 Java 中是不可能的。
元组经常与 List
进行比较,因为它看起来非常像列表。但它们在某些方面有所不同。
javatuples 库存在于 maven 中央仓库中,我们可以添加此依赖项以使用该库。找到此链接的最新版本。
<dependency>
<groupId>org.javatuples</groupId>
<artifactId>javatuples</artifactId>
<version>1.2</version>
</dependency>
Javatuples 支持大小最大为 '10'
的元组,并且对于每个大小,它都提供了如下所示的元组实现。
Unit
(一个元素)Pair
(两个元素)Triplet
(三元素)Quartet
(四元素)Quintet
(五元素)Sextet
(六元素)Septet
(七个元素)Octet
(八个元素)Ennead
(九元素)Decade
(十个元素)除了上述类之外,它还提供了两个类来轻松表示对。这些与 Pair
基本相同,但语法更冗长。
不同类型的元组是:
equals()
和hashCode()
实现了toString()
元组对象由每个元组类提供的工厂方法with()
构造。例如,要创建我们可以使用的 Pair
元组。
Pair<String, Integer> pair = Pair.with("Sajal", 12);
Quartet<String, Integer, String, Double> quartet1 = Quartet.with("A1",1,"A3",2.3);
我们还可以使用Pair
的构造函数。
Pair<String, Integer> person = new Pair<>("Sajal", 12);
我们可以从 Collection
或 Iterable
创建元组,前提是该集合的对象数与元组中的项目数相同。
在这种情况下,请记住集合中的项数应与我们要创建的元组类型相匹配。
//Collection of 4 elements will create Quartet
List<String> listOf4Names = Arrays.asList("A1","A2","A3","A4");
Quartet<String, String, String, String> quartet = Quartet.fromCollection(listOf4Names);
System.out.println(quartet);
//Create a pair with items starting from the specified index.
List<String> listOf4Names = Arrays.asList("A1","A2","A3","A4");
Pair<String, String> pair1 = Pair.fromIterable(listOf4Names, 2);
System.out.println(pair1);
程序输出。
[A1, A2, A3, A4]
[A3, A4]
同样,我们可以根据需要在任何元组类中创建对象。
getValue()
方法我们可以使用其索引的 getValueX()
方法从元组中获取值,其中 'X'
表示元素在元组中的位置。例如,getValue0()
、getValue1()
等。
Pair<String, Integer> pair = Pair.with("Sajal", 12);
System.out.println("Name : " + pair.getValue0());
System.out.println("Exp : " + pair.getValue1());
程序输出。
Name : Sajal
Exp : 12
请注意,这些getValue() 方法是类型安全的。这意味着编译器已经根据用于初始化元组的元素值知道方法返回类型。
getValue(int index)
方法元组有另一种方法getValue(int index),它不是类型安全的。所以当我们赋值给一个变量时,我们需要将值转换为预期的类型。
Pair<String, Integer> pair = Pair.with("Sajal", 12);
System.out.println("Name : " + pair.getValue(0));
System.out.println("Exp : " + pair.getValue(1));
程序输出。
Name : Sajal
Exp : 12
KeyValue
和LabelValue
类分别具有 getKey()/getValue() 和 getLabel()/getValue() 方法。
我们可以在元组创建后设置值。我们可以通过 setAtX()
方法完成此操作,其中 'X'
是我们要设置值的索引位置。
Pair<String, Integer> pair = Pair.with("Sajal", 12);
//Modify the value
Pair<String, Integer> modifiedPair = pair.setAt0("Kajal");
System.out.println(pair);
System.out.println(modifiedPair);
程序输出。
[Sajal, 12]
[Kajal, 12]
请注意元组是不可变的。所以
setAt()
方法返回具有修改值的相同类型的元组。 原始元组不变。
add()
方法我们还可以在 Tuple 中添加元素,它将返回一个与元素数量匹配的新元组类型。例如,如果我们将一个元素的值添加到 Pair
中,那么我们将得到一个 Triplet
对象作为回报。
一个新元素被添加到元组的末尾。
Pair<String, Integer> pair = Pair.with("Sajal", 12);
Triplet<String, Integer, String> triplet = pair.add("IT Professional");
System.out.println(pair);
System.out.println(triplet);
程序输出。
[Sajal, 12]
[Sajal, 12, IT Professional]
我们也可以将一个元组对象添加到另一个元组。它将根据添加后存在的元素数量返回 Tuple 的类型。
Triplet<String, String, String> triplet = Triplet.with("Java", "C", "C++");
Quartet<String, String, String, String> quartet = triplet.addAt1("Python");
Septet septet = quartet.add(triplet); //3 + 4 = 7
System.out.println(triplet);
System.out.println(quartet);
System.out.println(septet);
程序输出。
[Java, C, C++]
[Java, Python, C, C++]
[Java, Python, C, C++, Java, C, C++]
addAt()
方法默认情况下,新元素添加在元组的末尾。但是我们也可以使用 addAtX()
方法在元组的其他位置添加元素。
Triplet<String, String, String> triplet = Triplet.with("Java", "C", "C++");
Quartet<String, String, String, String> quartet = triplet.addAt1("Python");
System.out.println(triplet);
System.out.println(quartet);
程序输出。
[Java, C, C++]
[Java, Python, C, C++]
每个元组类都提供了asList() 和toArray() 方法,分别返回List
和Array
。
//Convert to list
Quartet<String, Integer, String, Double> quartet1 = Quartet.with("A1",1,"A3",2.3);
List<Object> quartletList = quartet1.toList();
System.out.println(quartletList);
//Convert to array
Object[] quartletArr = quartet1.toArray();
System.out.println(Arrays.toString(quartletArr));
程序输出。
[A1, 1, A3, 2.3]
[A1, 1, A3, 2.3]
请注意,元组可以包含异构类型,因此结果类型将相应地为
List或
Object[]
。< /p>
所有元组类都实现了 Iterable
接口,因此它们可以像集合或数组一样进行迭代。
Quartet<String, Integer, String, Double> quartet1 = Quartet.with("A1",1,"A3",2.3);
for(Object obj : quartet1) {
System.out.println(obj);
}
程序输出。
A1
1
A3
2.3
所有元组类都有以下实用方法,如集合,我们可以根据需要使用它们。
true
。true
。元组还提供了 hashCode()、equals() 和 compareTo() 方法的通用实现,这些方法可以很好地与包装类和字符串类一起使用。
在此 Java 元组教程 中,我们了解了如何通过 javatuple 库在 java 中使用元组。因此,如果您需要存储固定数量的异构元素的数据结构,您可以使用这个库。
这个库简单明了,易于使用,并提供良好的性能。
地址:https://www.cundage.com/article/java-tuples.html