• Tags         
  • 2018-08-20  09:05:13        
  • 192 °C    

    “元组”一词的意思是“由多个部分组成的数据结构”。因此,元组可以被定义为可以保存多个值的数据结构,并且这些值可以彼此相关/不相关。

    例:

    [极客,123,&#* @]
    

    在此示例中,元组中的值完全没有相互关联。“极客”这个词有意义。“123”是数字。虽然“&#* @”只是一些特殊字符。因此,元组中的值可能相互关联,也可能不相关。

    JavaTuple

    JavaTuples是一个Java库,它提供了用于处理元组的类,函数和数据结构。它是有史以来最简单的java库之一。

    JavaTuples提供以下类来使用:

    • JavaTuples最多允许10个元组。每个类都是:
      For 1 element   - Unit<A>
      For 2 elements  - Pair<A, B> 
      For 3 elements  - Triplet<A, B, C> 
      For 4 elements  - Quartet<A, B, C, D> 
      For 5 elements  - Quintet<A, B, C, D, E> 
      For 6 elements  - Sextet<A, B, C, D, E, F> 
      For 7 elements  - Septet<A, B, C, D, E, F, G> 
      For 8 elements  - Octet<A, B, C, D, E, F, G, H> 
      For 9 elements  - Ennead<A, B, C, D, E, F, G, H, I> 
      For 10 elements - Decade<A, B, C, D, E, F, G, H, I, J>
    • JavaTuples还提供了2个非常常见的2元素元组类,相当于Pair:
      KeyValue <A,B> 
      LabelValue <A,B>
      

    注意:要运行JavaTuples程序,需要在IDE中添加org.javatuples库。IDE可以是Netbeans,Eclipse等。在这里下载JavaTuples Jar库。要在Netbeans中添加库。

    JavaTuples 的基本特征是:

    • 他们是Typesafe
    • 他们是永恒的
    • 他们是可迭代
    • 它们是Serializable
    • 它们是Comparable(实现Comparable <Tuple>)
    • 他们实现equals()hashCode()
    • 他们还实现toString()

    为什么更喜欢JavaTuples而非Lists / Arrays?

    考虑一种情况,您希望将学生的详细信息存储在一个实体中,例如名称,卷号,父亲姓名,联系号码。现在,最常见的方法是构建一个可以根据需要获取字段的数据结构。这就是元组发挥作用的地方。使用Tuples,无需创建任何单独的数据结构。相反,对于这种情况,可以简单地使用四方<A,B,C,D>。

    因此,常见的数据结构如List,Array:

    • 只能是特定类型。
    • 可以是infinte元素。

    鉴于,元组:

      • 可以是任何类型,它们是类型安全的
      • 可以是数量有限,从1-10

    创建JavaTuples

    注意:以下示例显示为通用方法。它们可以根据需要通过使用值替换。参数的数量和相应的Tuple类来用于任何JavaTuple 。

    来自构造函数语法

    NthTuple <type 1,type 2,..,type n> nthTuple = new NthTuple 
                    <type 1,type 2,..,type n>(value 1,value 2,..,value n);
    

    示例

    
    Pair<Integer, String> pair = new Pair<Integer, String>(  
                                  Integer.valurOf(1), "Geeks"); 
       
    Sextet<Integer, String, Integer, String, Integer, String> sextet 
                               = new Sextet<Integer, String, Integer,  
                                             String, Integer, String>( 
                                                 Integer.valueOf(1), "Geeks", 
                                                 Integer.valueOf(2), "For", 
                                                 Integer.valueOf(3), "Geeks"
                                                 ); 
      
    

    使用with()方法语法

    NthTuple <type 1,type 2,..,type n> nthTuple 
        = NthTuple.with(value 1,value 2,..,value n);
    

    示例

    Pair<Integer, String> pair = Pair.with(Integer.valurOf(1), "Geeks");
    
    Sextet<Integer, String, Integer, String, Integer, String> sextet
        = Sextet.with(Integer.valueOf(1), "Geeks",
                      Integer.valueOf(2), "For",
                      Integer.valueOf(3), "Geeks");
    

    来自其他系列语法

    NthTuple <type,type,..,type> nthTuple 
             = NthTuple.fromCollection(collectionWith_n_values);
    

    示例

    Pair<String, String> pair = Pair.fromCollection(collectionWith2Values);
    
    Sextet<Integer, String, Integer, String, Integer, String> sextet
        = Sextet.fromCollection(collectionWith6Values);
    

    获取JavaTuples值

    语法

    NthTuple <type 1,type 2,..,type n> nthTuple = new NthTuple 
                    <type 1,type 2,..,type n>(value 1,value 2,..,value n); 
    typeX valX = nthTuple.getValueX-1();
    示例
    Pair < Integer, String >
    pair = new Pair<Integer, String>(Integer.valurOf(1), "Geeks");
     
    // This will set val2 = "Geeks"
    String val2 = pair.getValue1();
     
    Sextet<Integer, String, Integer, String, Integer, String> sextet
        = new Sextet<Integer, String, Integer, String, Integer, String>(
                                            Integer.valueOf(1), "Geeks",
                                            Integer.valueOf(2), "For",
                                            Integer.valueOf(3), "Geeks"
                                            );
     
    // This will set val5 = 3
    Integer val5 = sextet.getValue4();
    

    注意

    • 值编号从索引0开始。因此对于第n个值,getter将是getValue n-1()
    • NthTuple对象只能将getValue 0()赋予getValue n-1()有效的getter(例如,Sextet没有getValue6()方法)。
    • 所有getValueX()getter都是类型安全的,即不需要强制转换。这是因为元组类的类型参数化(“<a, b,="" c="">“在Triplet<a, b,="" c="">)编译器将知道value0是A类型,value1是B类型,依此类推。</a,></a,>
    • 还有一个getValue(int pos)方法,但不建议使用它,因为编译器不能事先知道结果的类型,因此需要进行强制转换:Triplet <String,Integer,Double> triplet = ...
      ...
      Integer intVal =(Integer)triplet.getValue(1);
          • KeyValueLabelValue将其getValue0()/ getValue1()方法分别重命名为getKey()/ getValue()和getLabel()/ getValue()

    设置JavaTuples值

    由于JavaTuples是不可变的,这意味着无法在任何索引处修改值。
    因此,JavaTuples提供setAtX(value),它在索引X处创建一个带有新值的元组副本,并返回该元组。

    语法

    NthTuple <type 1,type 2,..,type n> nthTuple = new NthTuple 
                    <type 1,type 2,..,type n>(value 1,value 2,..,value n); 
    nthTuple = nthTuple.setAtX(val);
    

    示例

    Pair<Integer, String> pair = new Pair<Integer, String>(
                                Integer.valueOf(1), "Geeks");
     
    pair = pair.setAt1("For"); // This will return a pair (1, "For")
     
    Sextet<Integer, String, Integer, String, Integer, String> sextet
        = new Sextet<Integer, String, Integer, String, Integer, String>(
                                            Integer.valueOf(1), "Geeks",
                                            Integer.valueOf(2), "For",
                                            Integer.valueOf(3), "Geeks"
                                            );
     
    // This will return sextet (1, "Geeks", 2, "For", 3, "Everyone")
    Sextet<Integer, String, Integer, String, Integer, String> otherSextet
        = sextet.setAt5("Everyone");
    

    迭代JavaTuple值

    javatuples中的所有元组类都实现了Iterable <Object>接口。这意味着它们可以以与集合或数组相同的方式进行迭代。

    示例

    Triplet<String, Integer, Double> triplet = ...... for (Object value : tuple)
    {
        ...
    }
    

     
    转载请保留页面地址:https://www.breakyizhan.com/java/5400.html