Javatuples - 在 Java 中使用元组

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(459)   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 中使用元组。因此,如果您需要存储固定数量的异构元素的数据结构,您可以使用这个库。

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

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

相关阅读

在此 java 示例中,我们将学习使用 NamespaceContext 具有命名空间声明和各自的用法。 命名空间添加了 XML 文件 我创建了 sample.xml 文件并放入类路径中。 &l...
Spring Boot Data JPA Query By Example 教程展示了如何使用 Spring Data JPA Query By Example 技术创建查询。 春天 是用于创建...
Spring Boot Data JPA 排序教程展示了如何在 Spring Data JPA 中对查询结果进行排序。查询结果使用 ORDER BY 子句或 Sort 对象进行排序。 春天 是一...
Learn about various Java 中的数据类型. Learn the differences between 原始数据类型 and non-primitive datatypes...
Spring Data 提供了一种统一且简单的方法来访问不同类型的持久性存储,包括关系数据库系统和 NoSQL 数据存储。它在 JPA 之上,添加了另一个抽象层并定义了一个基于标准的设计以支持 ...
名为 Ingalls 的新 Spring Data 发布火车的公告 引起我注意的项目之一是 Spring Data Cassandra 最终支持 Cassandra 3+。因此,我重新访问了我的...
Spring Data JPA 允许您通过使用 Repository 接口快速开发数据访问层。有时您需要从 Spring Data JPA 访问 EntityManager。这篇文章向您展示了如...
Spring Boot Data JPA @Query 教程展示了如何使用 Data JPA @Query 创建自定义查询。 春天 是用于创建企业应用程序的流行 Java 应用程序框架。 弹弓贴...
在本教程中,我给出了一个示例在 java 中实现 List。通过在 DemoList 类中添加或删除方法,可以随意自定义列表的行为。如果您有一些想法可以使此实现更好,请与我们分享。 Java 列...
Spring Boot Data JPA 派生查询教程展示了如何从方法名称创建查询。 春天 是用于创建企业应用程序的流行 Java 应用程序框架。 弹弓贴 是 Spring 框架的演变,它有助于...