Java 元组介绍

原文:https://www.studytonight.com/java-examples/introduction-to-java-tuples

元组是一种数据结构,它像数组或列表一样以有序序列存储数据。但是与数组或列表不同,元组可以存储不同类型的数据

例如,我们可以在元组中存储[“string”,123,123.321,' c']但不能使用数组或列表来存储。使用数组或列表实现这一点的唯一方法是创建一个字符串数组,并使用字符串存储它们,但这可能非常麻烦。

String[] arr = {"string", "123", "123.321", "c"};

我们还可以用所需类型的数据成员创建自己的类,这也会导致混乱和延迟。

Java 不提供任何实现元组的数据结构或集合,但是我们可以将名为 Java 元组的外部库添加到我们的项目中来使用它的元组类。这是一个简单明了的库,提供了不同的方法来处理元组。

Java 元组库

Java 元组库提供了十个不同的类,可以用来处理元组。这些类之间的区别在于可以存储在其中的元素数量。我们不能在一个 Java 元组类中存储超过 10 个元素。这些类的名称如下。

  • 单元< A > 存储一个元素。
  • 配对< A、B > 储存两个元素。
  • 三元组< A、B、C > 储存三个元素。
  • 四方< A、B、C、D > 储存元素。
  • 五重奏< A、B、C、D、E > 储存五个元素。
  • 六位< A、B、C、D、E、F > 储存六个元素。
  • 九月< A、B、C、D、E、F、G > 储存七个元素。
  • 八位字节< A、B、C、D、E、F、G、H > 存储八个元素。
  • Ennead < A、B、C、D、E、F、G、H、I > 储存九个元素。
  • 十年< A、B、C、D、E、F、G、H、I、J > 储存十个元素。

我们还有两个类叫做键值< A,B >标签值< A,B > 。这些类似于配对< A、B >类。字母 A、B、C 等表示要存储在元组中的不同元素的数据类型。

这个库的所有元组类都是类型安全不可变。我们不能在创建对象后更改数据或元组的结构。所有这些类都实现了可迭代可序列化可比较接口。

在 Java 中创建元组

创建元组非常简单。我们只需要向类构造器指定元素的数据类型及其值。

import org.javatuples.*;

public class TupleDemo
{
    public static void main(String[] args)
    {
        Triplet<String, Double, Integer> tuple1 = new Triplet<String, Double, Integer>("Str", 5.0, 5);
        System.out.println(tuple1);
    }
}

【Str,5.0,5】

我们也可以使用和()方法来创建一个新的元组。

import org.javatuples.*;

public class TupleDemo
{
    public static void main(String[] args)
    {
        Triplet<String, Double, Integer> tuple2 = Triplet.with("Str", 5.0, 5);
        System.out.println(tuple2);
    }
}

【Str,5.0,5】

我们也可以使用 fromCollection()fromIterable() 方法从集合中创建一个新的元组。使用 fromCollection()时,请确保根据集合的大小使用正确的元组类。fromIterable()方法可以用来创建一个较小大小的元组,方法是指定应该从其中挑选元素的索引。

import java.util.Arrays;
import java.util.List;
import org.javatuples.*;

public class TupleDemo
{
    public static void main(String[] args)
    {
        List<String> list = Arrays.asList("unit","pair", "triplet");
        Triplet<String, String, String> tuple1 = Triplet.fromCollection(list);
        System.out.println(tuple1);

        Pair<String, String> tuple2 = Pair.fromIterable(list, 1);//two elements to be fetched from index 1
        System.out.println(tuple2);
    }
}

【单位、对、三元组】 【对、三元组】

在 Java 中获取元组的值

我们可以使用 getValue(X)getValueX() 方法来获取元组中索引 X 处的元素。就像数组一样,元组也遵循零基索引。注意 getValue()方法不是类型安全的。使用这种方法时,我们需要使用铸造。但是 getValueX()方法是类型安全的,不需要铸造

import org.javatuples.*;

public class TupleDemo
{
    public static void main(String[] args)
    {
        Triplet<String, Integer, Double> tuple = Triplet.with("Str", 5, 5.0);
        Integer i = (Integer)tuple.getValue(1);//casting
        Integer j = tuple.getValue1();

        System.out.println("Value fetched by getValue(): " + i);
        System.out.println("Value fetched by getValueX(): " + j);
    }
}

getValue()获取的值:5 getValueX()获取的值:5

在 Java 中设置元组的值

我们可以通过使用 setAtX() 方法来改变元组中元素的值,其中 X 是索引。这将返回与原始元组相同类的元组。由于元组是不可变的,所以原始元组不会以任何方式改变。

import org.javatuples.*;

public class TupleDemo
{
    public static void main(String[] args)
    {
        Triplet<String, Integer, Double> tuple1 = Triplet.with("Str", 5, 5.0);
        Triplet<String, Integer, Double> tuple2 = tuple1.setAt2(5.1);

        System.out.println("Original Tuple: " + tuple1);
        System.out.println("New Tuple with changes: " + tuple2);
    }
}

原始元组:[Str,5,5.0] 有变化的新元组:[Str,5,5.1]

在元组中添加元素

我们可以向现有的元组添加值,但是我们需要创建一个更大的新元组来容纳新元素。

例如,如果我们向 Septet 类元组添加一个元素,那么我们将得到一个 Octet 元组。

我们可以使用 add() 方法在元组的末尾添加一个元素。或者我们可以使用 addAtX() 方法在索引 x 处添加一个元素。这将把其他元素向右推一个位置。在插入新元素之前,请确保数据类型匹配。

import org.javatuples.*;

public class TupleDemo
{
    public static void main(String[] args)
    {
        Triplet<String, String, String> tuple1 = Triplet.with("str1", "str2", "str3");
        Quartet<String, String, String, String> tuple2 = tuple1.add("str4");
        Quartet<String, String, String, String> tuple3 = tuple1.addAt0("str0");

        System.out.println("Original Tuple: " + tuple1);
        System.out.println("Adding using add(): " + tuple2);
        System.out.println("Adding using addAtX(): " + tuple3);
    }
}

原始元组:[str1,str2,str3] 使用 add(): [str1,str2,str3,str4] 使用 addAtX(): [str0,str1,str2,str3]添加

这两种方法也可以用来将一个元组添加到另一个元组。我们需要小心新元组的最终大小。例如,如果一个配对类元组被添加到一个三元组类元组,则创建一个五元组元组。确保两个元组的组合大小不超过 10。

import org.javatuples.*;

public class TupleDemo
{
    public static void main(String[] args)
    {
        Triplet<String, String, String> tuple1 = Triplet.with("str1", "str2", "str3");
        Pair<String, String> tuple2 = Pair.with("str4", "str5");
        Quintet<String, String, String, String, String> tuple3 = tuple1.add(tuple2);
        Quintet<String, String, String, String, String> tuple4 = tuple1.addAt1(tuple2);

        System.out.println("Adding tuples using add(): " + tuple3);
        System.out.println("Adding tuples using addAtX(): " + tuple4);
    }
}

使用 add()添加元组:【str1、str2、str3、str4、str5】 使用 addAtX()添加元组:【str1、str4、str 5、str2、str3】

移除元素

removeFromX() 方法可用于从索引 x 中移除元素。这将返回比原始数组小一个大小的元组。例如,当 removeFromX()用于四元组时,则返回一个三元组元组。

import org.javatuples.*;

public class TupleDemo
{
    public static void main(String[] args)
    {
        Triplet<String, String, String> tuple1 = Triplet.with("str1", "str2", "str3");
        Pair<String, String> tuple2 = tuple1.removeFrom0();
        Pair<String, String> tuple3 = tuple1.removeFrom1();

        System.out.println("Original Tuple: " + tuple1);
        System.out.println("Removing element at index 0: " + tuple2);
        System.out.println("Removing element at index 1: " + tuple3);
    }
}

原始元组:[str1,str2,str3] 移除索引 0 处的元素:[str2,str3] 移除索引 1 处的元素:[str1,str3]

循环/迭代元组

由于元组实现了可迭代接口,我们可以使用简单的 for-each 循环轻松地循环或迭代一个元组。

import org.javatuples.*;

public class TupleDemo
{
    public static void main(String[] args)
    {
        Triplet<String, String, String> tuple = Triplet.with("str1", "str2", "str3");

        for(Object o : tuple)
            System.out.print(o + " ");
    }
}

str1 str2 str3

Java 元组包含()和 containsAll()方法

顾名思义,contains()方法根据元组中元素的存在情况返回一个布尔值。

import org.javatuples.*;

public class TupleDemo
{
    public static void main(String[] args)
    {
        Triplet<String, String, String> tuple = Triplet.with("str1", "str2", "str3");    
        boolean containsStr1 = tuple.contains("Str1");
        boolean containsstr1 = tuple.contains("str1");

        System.out.println("Tuple contains Str1: " + containsStr1);
        System.out.println("Tuple contains str1: " + containsstr1);
    }
}

元组包含 Str1:假 元组包含 str1:真

containsAll()方法可用于检查元组中是否存在集合的所有元素。这个方法也返回一个布尔值

import java.util.Arrays;
import java.util.List;
import org.javatuples.*;

public class TupleDemo
{
    public static void main(String[] args)
    {
        Triplet<String, String, String> tuple = Triplet.with("str1", "str2", "str3");
        List<String> list1 = Arrays.asList("str1", "str3", "str2");
        List<String> list2 = Arrays.asList("str1", "str5", "str2");

        System.out.println("Tuple contains list1: " + tuple.containsAll(list1));
        System.out.println("Tuple contains list2: " + tuple.containsAll(list2));
    }
}

元组包含列表 1:真 元组包含列表 2:假

Java 元组 indexOf()和 lastIndexOf()方法

indexOf()方法返回元组中第一个元素的索引。

方法返回元组中元素最后一次出现的索引。

import org.javatuples.*;

public class TupleDemo
{
    public static void main(String[] args)
    {
        Quartet<String, String, String, String> tuple = Quartet.with("str1", "str2", "str1", "str3");

        System.out.println("Tuple: " + tuple);
        System.out.println("First index of str1:" + tuple.indexOf("str1"));
        System.out.println("Last index of str1: " + tuple.lastIndexOf("str1"));
    }
}

元组:【str1,str2,str1,str 3】 str 1 的第一个索引:0 str 1 的最后一个索引:2

将元组转换为数组或列表

我们可以使用 toArray() 方法轻松地将元组转换为数组。同样,我们可以使用 toList() 方法将元组转换为列表。注意这两个方法将返回对象类型的数组和列表(对象[] arr,列表<对象>列表),即使元组的所有元素具有相同的数据类型。

import java.util.Arrays;
import java.util.List;
import org.javatuples.*;

public class TupleDemo
{
    public static void main(String[] args)
    {
        Quartet<String, String, String, String> tuple = Quartet.with("str1", "str2", "str1", "str3");
        Object[] arrFromTuple = tuple.toArray();
        List<Object> listFromTuple = tuple.toList();

        System.out.println("Tuple: " + tuple);
        System.out.println("Array: " + Arrays.toString(arrFromTuple));
        System.out.println("List: " + listFromTuple);
    }
}

元组:[str1,str2,str1,str3] 数组:[str1,str2,str1,str3] 列表:[str1,str2,str1,str3]

常见问题

问:在 Java 中使用类如何实现元组?

元组的大小是固定的,用于将不同类型的数据存储在一起。例如,如果我们想要存储一个字符串、一个整数和一个双数,那么我们可以用这三个数据成员创建一个类,并编写适当的构造器来创建一个这种类型的新对象。但是最好使用像 Java 元组这样的外部库。

问:元组比列表快吗?

是的,元组比列表更快,因为它们的大小是固定的,并且是不可变的,所以我们可以只给它们分配一块内存,而不需要为额外的元素添加额外的空间。与列表相比,遍历元组也更快。

摘要

如果我们只希望分配一次数据,而不想再次更改该数据,元组是一种重要的数据结构。它们可以用来存储包含不同数据类型字段的记录,如[101,“巧克力”,5.99]。Java 元组库提供了不同的类,可以用来处理元组。元组类最多可以存储 10 个元素。关于元组需要注意的一点是,当我们设置、添加或移除值时,我们并没有改变原始元组,而是用修改创建了一个新的元组。这是因为元组是不可变的。