Javatuples - 在 Java 中使用元组

位置:首页>文章>详情   分类:Java教程   阅读(235)   2023-06-26 07:54:18

在此Java 元组教程中,我们将了解元组——一种通用数据结构,以及我们如何在Java 程序中使用元组。默认情况下,元组不是作为数据结构的 Java 编程语言的一部分,因此我们将使用一个不错的第三方库 javatuples 为它。

1.什么是元组?

元组可以看作是不同类型对象的有序集合。这些对象不一定以任何方式相互关联,但它们共同具有一定的意义。

例如,["Sajal Chakraborty," "IT Professional," 32] 可以是一个元组,其中元组中的每个值都没有任何关系,但是这整组值在应用程序。例如,give 元组可能表示具有姓名、部门和年龄的员工数据。

让我们看一些更多的 java 元组示例

["Java", 1.8, "Windows"]

["Alex", 32, "New York", true]

[3, "Alexa", "howtodoinjava.com", 37000]

2. Java 中的元组

Java 没有任何此类内置数据结构来支持元组。无论何时需要,我们都可以创建一个可以像元组一样工作的类。

此外,在 Java 中,部分元组功能可以使用 ListArray 编写,但这些不允许我们在设计上保存不同类型的数据类型。所以我们可以说使用标准数据结构的异构元组在 Java 中是不可能的。

2.1.元组与列表/数组的比较

元组经常与 List 进行比较,因为它看起来非常像列表。但它们在某些方面有所不同。

  1. 元组是可以包含异构数据的对象。列表旨在存储单一类型的元素。
  2. 在所有数据结构中,元组被认为是最快的,并且它们消耗的内存最少。
  3. 虽然数组和列表是可变的,这意味着您可以更改它们的数据值并修改它们的结构,但元组是不可变的。
  4. 与数组一样,元组的大小也是固定的。这就是元组旨在完全取代数组的原因,因为它们在所有参数方面都更加高效。
  5. 如果您有一个数据集,一生只会分配一次并且其值不应再次更改,则您需要一个元组。

3.Java元组库

3.1. Maven 依赖

javatuples 库存在于 maven 中央仓库中,我们可以添加此依赖项以使用该库。找到此链接的最新版本

<dependency>
    <groupId>org.javatuples</groupId>
    <artifactId>javatuples</artifactId>
    <version>1.2</version>
</dependency>

3.2.核心课程

Javatuples 支持大小最大为 '10' 的元组,并且对于每个大小,它都提供了如下所示的元组实现。

  • Unit(一个元素)
  • Pair(两个元素)
  • Triplet(三元素)
  • Quartet(四元素)
  • Quintet(五元素)
  • Sextet(六元素)
  • Septet(七个元素)
  • Octet(八个元素)
  • Ennead(九元素)
  • Decade(十个元素)

除了上述类之外,它还提供了两个类来轻松表示对。这些与 Pair 基本相同,但语法更冗长。

  1. KeyValue
  2. LabelValue

3.3.特点和优势

不同类型的元组是:

  1. 类型安全
  2. 不可变
  3. 可迭代
  4. 可序列化
  5. Comparable(实现Comparable接口)
  6. 实施equals()hashCode()
  7. 实现了toString()

4. 元组操作

4.1.创建元组

4.1.1.工厂方法

元组对象由每个元组类提供的工厂方法with() 构造。例如,要创建我们可以使用的 Pair 元组。

Pair<String, Integer> pair = Pair.with("Sajal", 12);

Quartet<String, Integer, String, Double> quartet1 = Quartet.with("A1",1,"A3",2.3);

4.1.2.构造器

我们还可以使用Pair构造函数

Pair<String, Integer> person = new Pair<>("Sajal", 12);

4.1.3.来自 Collection 或 Iterable

我们可以从 CollectionIterable 创建元组,前提是该集合的对象数与元组中的项目数相同。

在这种情况下,请记住集合中的项数应与我们要创建的元组类型相匹配。

//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]

同样,我们可以根据需要在任何元组类中创建对象。

4.2.从元组获取值

4.2.1. 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() 方法是类型安全的。这意味着编译器已经根据用于初始化元组的元素值知道方法返回类型。

4.2.2. 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

KeyValueLabelValue 类分别具有 getKey()/getValue() 和 getLabel()/getValue() 方法。

4.3.在元组中设置值

我们可以在元组创建后设置值。我们可以通过 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() 方法返回具有修改值的相同类型的元组。 原始元组不变

4.4.添加和删​​除值

4.4.1. 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++]

4.4.2. 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++]

4.5.将元组转换为集合或数组

每个元组类都提供了asList()toArray() 方法,分别返回ListArray

//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>

4.6.迭代元组值

所有元组类都实现了 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

4.7.更多元组操作

所有元组类都有以下实用方法,如集合,我们可以根据需要使用它们。

  • contains() – 如果此元组包含指定元素,则返回 true
  • containsAll() – 如果此元组包含所有指定元素,则返回 true
  • indexOf() – 返回指定元素第一次出现的索引。
  • lastIndexOf() – 返回指定元素最后一次出现的索引。

元组还提供了 hashCode()equals()compareTo() 方法的通用实现,这些方法可以很好地与包装类和字符串类一起使用。

5.结论

在此 Java 元组教程 中,我们了解了如何通过 javatuple 库在 java 中使用元组。因此,如果您需要存储固定数量的异构元素的数据结构,您可以使用这个库。

这个库简单明了,易于使用,并提供良好的性能。

标签: Java Data Structure
地址:https://www.cundage.com/article/java-tuples.html