前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TS数据类型:从C++/Java/Python到TS看元组tuple—元组的来龙去脉

TS数据类型:从C++/Java/Python到TS看元组tuple—元组的来龙去脉

原创
作者头像
周陆军博客
发布2023-05-07 22:57:55
7350
发布2023-05-07 22:57:55
举报
文章被收录于专栏:前端博客前端博客

在C++、Java这种强类型语言中,常用的Array、List、Set ,在集合中只能是一种类型(可以复习下:《再谈Java数据结构—分析底层实现与应用注意事项)。

代码语言:javascript
复制
int?data[]?=?new?int[3]
List<String>?person=new?ArrayList<>();
Set<Integer>?test?=?new?TreeSet<>();

如果需要一个固定大小的不同类型值的集合,我们需要使用元组。

元组(Tuple)

元组(Tuple)是固定数量的不同类型的元素的组合

元组与集合的不同之处在于,元组中的元素类型可以是不同的,而且数量固定。元组的好处在于可以把多个元素作为一个单元传递。如果一个方法需要返回多个值,可以把这多个值作为元组返回,而不需要创建额外的类来表示。

Tuple具体是怎么的数据结构呢?

元组(tuple)是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性。 在二维表里,元组也称为行。

系数据库中的「纪录」的另一个学术性的名称就是「元组」, 一条记录就是一个元组, 一个表就是一个关系, 纪录组成表, 元组生成关系, 这就是关系数据库的核心理念。

我们将一个元组理解为数据表中的一行,而一行中每个字段的类型是可以不同的。

TypeScript元组Tuple

TypeScript把强类型射到了JavaScript内,使得JavaScript更像Java了,如:

let sites:string[]? ----> String args[]

JavaScript数组本来就可以存放任意类型。

考虑下面的 js 代码:

代码语言:javascript
复制
const?arr?=?['I',?'l',?4,?'514']

但是TypeScript,就变成元组了。其实你不了解元组这个概念也可以照样用。就当类型都要指定就行。

代码语言:javascript
复制
const?arr:?readonly?[string,?string,?number,?string]?=?['I',?'l',?4,?'514']

对于越界的元素,它的类型会被限制为元组中每个类型的联合类型

代码语言:javascript
复制
let?arr:?[string,?number]??=?['Tom',?25];
arr.push(true);
//?Argument?of?type?'true'?is?not?assignable?to?parameter?of?type?'string?|?number'.

TypeScript元组继承自于函数编程语言(如 F#)——一家亲。

元组是定长的,所以不同长度的元组是不兼容的。这是 ts 2.7 才引入的限制,如果需要变长的元组,请看?Fixed Length Tuples?这次改动的解释。

C++元组简介

tuple是一个强大的允许存放多个不同类型数据的容器,是对pair的泛化。也可以把他当做一个通用的结构体来用,不需要创建结构体又获取结构体的特征,在某些情况下可以取代结构体使程序更简洁,直观。std::tuple理论上可以有无数个任意类型的成员变量,而std::pair只能是2个成员,因此在需要保存3个及以上的数据时就需要使用tuple元组了(tuple(元组)在c++11中开始引用的)。

代码语言:javascript
复制
std::tuple<T1,?T2,?TN>?t1;?//创建一个空的tuple对象(使用默认构造),对应的元素分别是T1和T2...Tn类型,采用值初始化
std::tuple<T1,?T2,?TN>?t2(v1,?v2,?...?TN);??//创建一个tuple对象,它的两个元素分别是T1和T2?...Tn类型;?要获取元素的值需要通过tuple的成员get<Ith>(obj)进行获取(Ith是指获取在tuple中的第几个元素,请看后面具体实例)。
std::tuple<T1&>?t3(ref&);?//?tuple的元素类型可以是一个引用
std::make_tuple(v1,?v2);?//?像pair一样也可以通过make_tuple进行创建一个tuple对象

元组中的对象可以是任何不同的类型,具有任意长度

具体参看《C++ tuple元组的基本用法(总结)

Java元组Tuple

Jdk中是没有元组这个数据类型的,虽然使用数组或者map也能达到想要的效果,但总归是没有元组方便。

元组和列表list一样,都可能用于数据存储,包含多个数据;但是和列表不同的是:列表只能存储相同的数据类型,而元组不一样,它可以存储不同的数据类型,比如同时存储int、string、list等,并且可以根据需求无限扩展。 Object类型的List实际也是可以存储多种类型的啊?但是在创建List的时候,需要指定元素数据类型,也就是只能指定为Object类型,获取的元素类型就是Object,如有需要则要进行强转。而Tuple在创建的时候,则可以直接指定多个元素数据类型。

在java里面实现元组(tuple),就得将一组对象直接打包存储于一个单一对象。

代码语言:javascript
复制
public?class?TwoTuple<A,?B>?{
????public?final?A?first;
????public?final?B?second;
????public?TwoTuple(A?a,?B?b){
????????first?=?a;
????????second?=?b;
????}
????public?String?toString(){
????????return?"("?+?first?+?",?"?+?second?+?")";
????}

}
public?class?ThreeTuple<A,?B,?C>?extends?TwoTuple<A,?B>{
????public?final?C?third;
????public?ThreeTuple(A?a,?B?b,?C?c)?{
????????super(a,?b);
????????third?=?c;
????}
????public?String?toString(){
????????return?"("?+?first?+?","?+?second?+?","?+?third?+?")";
????}

}

当然,这个是没有用的。

java的元组库很多,比如:

https://www.javatuples.org/

https://www.vavr.io/

案例也写的很清楚,无需多说

python元组Tuple

Python 的集合式的数据类型list和tuple非常相似,不同的是:

tuple通过小括号( )定义,定义后无法编辑元素内容(即不可变),而list通过中括号[ ]定义,其元素内容可以编辑(即可变),编辑动作包含删除pop( )、末尾追加append( )、插入insert( ).

代码语言:javascript
复制
list1=['cong','rick','long']//list
tupe1=('Jan','Feb','Mar')//tuple,元组元素不可以被修改,不能增加也不能删除。
tupeformList?=?tuple(list1)

python的元组性质和java类似

元组和列表list一样,都可能用于数据存储,包含多个数据;

但是和列表不同的是:列表只能存储相同的数据类型,而元组不一样,它可以存储不同的数据类型,比如同时存储int、string、list等,并且可以根据需求无限扩展。

参考文章:

C++ tuple元组的基本用法(总结) https://blog.csdn.net/sevenjoin/java/article/details/88420885

C++中使用tuple https://blog.csdn.net/xiahn1a/article/details/41670203

Java元组Tuple介绍与使用 https://blog.csdn.net/u013412772/article/details/74298257

Java中使用元组 https://iogogogo.github.io/2020/01/09/java-tuple/

转载本站文章《TS数据类型:从C++/Java/Python到TS看元组tuple—元组的来龙去脉》, 请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/typescript/2020_0413_8380.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 元组(Tuple)
    • Tuple具体是怎么的数据结构呢?
    • TypeScript元组Tuple
    • C++元组简介
    • Java元组Tuple
    • python元组Tuple
    相关产品与服务
    数据保险箱
    数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
    http://www.vxiaotou.com