0
点赞
收藏
分享

微信扫一扫

【Dart】003-基本数据类型


【Dart】003-基本数据类型

文章目录

  • ​​【Dart】003-基本数据类型​​
  • ​​一、布尔和数字​​
  • ​​1、BMI 指数​​
  • ​​2、整型与浮点型​​
  • ​​代码示例​​
  • ​​num 类型​​
  • ​​3、数字的方法​​
  • ​​二、字符串​​
  • ​​1、字符串的定义​​
  • ​​概述​​
  • ​​代码示例​​
  • ​​引号说明​​
  • ​​2、字符串模板​​
  • ​​3、字符串方法​​
  • ​​字符数组​​
  • ​​截取方法​​
  • ​​去空格方法​​
  • ​​大小写字母转换​​
  • ​​判断开头、结尾、包含​​
  • ​​替换与分割​​
  • ​​三、聚合类型​​
  • ​​1、List 列表​​
  • ​​概述​​
  • ​​基本示例​​
  • ​​对列表常用操作​​
  • ​​2、Set 集合​​
  • ​​基本特征​​
  • ​​基本示例​​
  • ​​对集合常用操作​​
  • ​​3、Map 映射​​
  • ​​概述​​
  • ​​基本示例​​
  • ​​对映射的常用操作​​
  • ​​4、三种聚合类型的关系​​

一、布尔和数字

​Dart​​​ 中最基础类型只有 ​​bool​​​ 和 ​​num​​​ ,分别表示 ​​真假​​​ 和 ​​数字​​ 。

​bool​​:true、false

​num​​:整型 int 浮点型 double

1、BMI 指数

这里通过 ​​BMI​​​ 指数的例子介绍一下布尔和数字类型的使用。​​BMI​​​ 表示 ​​健康的指标​​​ ,公式是 ​​体重(kg)/身高(m)的平方​​​ 。在 ​​18.5 ~ 23.9​​ 之间,表示正常。

main() {
// 数字类型:身高体重
double result = bmi(height: 1.83 , weight: 78);
// 布尔类型:是否正常
bool normal = result >= 18.5 && result <= 23.9;
print(normal); // true
}

double bmi({
required double weight,
required double height,
}) {
return weight / (height * height);
}

2、整型与浮点型

代码示例

int count = 49; // 整型
double pi = 3.14; // 浮点型

num 类型

既可以表示整数,也可以表示小数

main() {
num age = 26;
num tall = 1.83;
print("Hello Dart! I'm $age years old and $tall meters tall.");
// Hello Dart! I'm 26 years old and 1.83 meters tall.
}

使用 ​​runtimeType​​​ 查看某个变量的运行时类型,可以说 ​​num​​ 会根据赋值状况,自动转换为对应的数字类型(类型推断)。

也可以理解为“父类”,​​number​​​ 类型是 ​​int​​​ 和 ​​double​​ 的父类。

main() {
num age = 26;
num tall = 1.83;
print("age:${age.runtimeType}, tall:${tall.runtimeType}");
// age:int, tall:double
}

3、数字的方法

这里列举一些 ​​num​​​ 常用的方法,其中 ​​num​​​ 的方法 ​​double​​​ 和 ​​int​​ 对象都可以使用。

闲聊*:看起来还真像“父类”;

main() {
num b = 3.28;
b.abs(); // 绝对值 : 3.28
b.ceil(); // 向上取整: 4
b.floor(); // 向下取整: 3
b.round(); // 四舍五入取整: 3
b.truncate(); // 去除小数部位取整: 3
String v = b.toStringAsFixed(1); // 四舍五入,保留几位小数,返回字符串: 3.3
print(v); // 3.3
}

在 ​​double​​​ 和 ​​int​​​ 中,定义了 ​​parse​​ 方法用于通过解析数据获得数字

main() {
double result1 = double.parse("3.3");
int result2 = int.parse("10");
print(result1.runtimeType); // double
print(result2.runtimeType); // int
}

对于 ​​int​​​ 类型来说,有一些关于 ​​进制​​​ 的方法,通过 ​​toRadixString​​ 可以把整型转化为其他进制,以字符串形式输出。

main() {
int a = 2022;
print(a.toRadixString(2)); // 11111100110
print(a.toRadixString(8)); // 3746
print(a.toRadixString(16)); // 7e6
print(a.toRadixString(32)); // 1v6
}

另外在 ​​int​​​ 解析字符串时,也可以指定字符串的进制。比如 ​​16​​​ 进制中,允许出现 ​​0~9​​​ 和 ​​a~f​​​ 。以此类推,对于 ​​36​​ 进制,可以包含数字和字母。那么找出你喜欢单词 36 进制的幸运数字吧。

有点意思:仅做摘录,不再演示!

int value = int.parse('7e6',radix: 16);
print(value); // 2022

int value1 = int.parse('toly',radix: 36);
print(value1); // 1384918

二、字符串

1、字符串的定义

概述

​Dart​​​ 中字符串的定义语法还是非常丰富的,如下所示:支持 ​​单引号​​​ 、​​双引号​​​ 、​​三单引号​​​、​​三双引号​​ 。

代码示例

String a = 'hello, toly';
String b = "hello, toly";
String c = '''hello, toly''';
String d = """hello, toly""";

引号说明

  • 比较推荐使用 ​​单引号​​ ;
  • 多个引号可以相互嵌套:同种引号嵌套需要加转义字符 ​​\​​ ;

2、字符串模板

一般情况下可以通过 ​​+​​​ 号来拼接字符串的内容,但如果通过多个变量来拼接字符串,使用 ​​+​​ 就非常麻烦。

​Dart​​ 中提供的字符串模板,在字符串中通过 ​​${变量}​​​ 插入变量,方便拼接。另外如果​​{}​​​ 中只有变量名称,可以省略 ​​{} ​​​。如下的 ​​$addr​​ :

main() {
String name = '訾博';
print('my name is ${name}');
print('my name is $name');
// my name is 訾博
// my name is 訾博
}

3、字符串方法

字符数组

字符串本身相当于若干字符组成的聚合对象(数组),可以通过 ​​[]​​​ 来访问第几个字符,一般称​​“第几个”​​​为 ​​索引​​ 。

好直接啊!​​java​​​ 还需要转成数组,​​dart​​ 直接当数组用!

main() {
String name = '訾博';
print(name[0]);
print(name[1]);
// 訾
// 博
}

截取方法

​substring​​​ 方法截取字符串。其中有两个入参,分别表示 ​​起始索引​​​ 和 ​​结束索引​​。注意,包含起始字符,不包含结束字符。

main() {
String name = '我的名字是訾博';
print(name.substring(2, 4)); // 名字
}

去空格方法

字符串的 ​​trim​​​ 方法用于去除首尾 ​​空格符​​​ ,另外 ​​trimLeft​​​ 只去除开头的空格; ​​trimRight​​ 只去除末尾的空格

main() {
String name = ' 我的名字 是訾博 ';
// 1. 去除字符串左侧端的空格
print(name.trimLeft());
// 2. 去除字符串右侧端的空格
print(name.trimRight());
// 3. 去除字符串两端的空格
print(name.trim());
// 我的名字 是訾博
// 我的名字 是訾博
// 我的名字 是訾博
}

大小写字母转换

字符串的 ​​toUpperCase​​​ 方法用于把所有字母变成大写字母;​​toLowerCase​​ 方法把所有字母变成小写字母

main() {
String name = '訾博(ZiBo)';
// 1. 转大写
print(name.toUpperCase());
// 2. 转小写
print(name.toLowerCase());
// 訾博(ZIBO)
// 訾博(zibo)
}

判断开头、结尾、包含

字符串有三个返回 ​​bool​​​ 类型的方法,如下分别校验 ​​是否以XXX开头​​​ 、​​是否以XXX结尾​​​、 ​​是否包含 XXX​

main() {
String name = '訾博(ZiBo)';
// 1. 判断开头
print(name.startsWith('訾'));
// 2. 判断结尾
print(name.endsWith('博'));
// 3. 判断包含
print(name.contains('訾博'));
// true
// false
// true
}

替换与分割

通过 ​​replaceAll​​​ 和 ​​split​​ 方法可以对字符串进行替换和分割操作

main() {
String name = '訾博(ZiBo),訾博(ZiBo),訾博(ZiBo)';
// 1、替换
print(name.replaceAll(',', ','));
// 2、分割
List<String> list = name.split(',');
print(list);
// 3、正则表达式,匹配字母
RegExp exp = new RegExp(r'[a-zA-Z]');
print(name.replaceAll(exp, ''));
// 訾博(ZiBo),訾博(ZiBo),訾博(ZiBo)
// [訾博(ZiBo),訾博(ZiBo),訾博(ZiBo)]
// 訾博(),訾博(),訾博()
}

三、聚合类型

比如一个班级中有若干个学生;一幅扑克里有 ​​52​​​ 张牌;一本英文字典里记录着众多单词和释义信息的对应关系。对于这些拥有多种元素的聚合体,一般编程语言中会有内置类型。 ​​Dart​​​ 中提供了 ​​List​​​ 、​​Map​​​ 、​​Set​​​ 分别用于表示 ​​列表​​​ 、​​映射​​​ 、​​集合​​ 类型。

1、List 列表

概述

​Dart​​​ 中通过 ​​List​​​ 来维护多个元素,列表用 ​​[]​​​ 进行定义,通过 ​​,​​ 来分隔元素。

基本示例

main() {
List<String> name = ['刘备', '关羽', '张飞'];
print(name); // [刘备, 关羽, 张飞]
}

对列表常用操作

main() {
List<String> list = ['刘备', '关羽', '张飞'];
List<String> list2 = ['曹操', '刘备', '孙权'];
// 1、for 循环
for (int i = 0; i < list.length; i++) {
print(list[i]);
}
// 2、增加元素
list.add('赵云');
print(list);
// 3、增加多个元素
list.addAll(list2);
print(list);
// 4、插入元素
list.insert(1, '诸葛亮');
print(list);
// 5、删除元素
list.remove('张飞');
print(list);
// 6、删除指定位置的元素
list.removeAt(1);
print(list);
// 7、修改元素
list[0] = '曹操';
print(list);
// 8、判断是否包含某个元素
print(list.contains('刘备'));
// 9、判断是否为空
print(list.isEmpty);
// 10、判断是否不为空
print(list.isNotEmpty);
// 11、获取元素的个数
print(list.length);
// 12、获取指定位置的元素
print(list[0]);
// 13、删除所有元素
list.clear();
print(list);
// 刘备
// 关羽
// 张飞
// [刘备, 关羽, 张飞, 赵云]
// [刘备, 关羽, 张飞, 赵云, 曹操, 刘备, 孙权]
// [刘备, 诸葛亮, 关羽, 张飞, 赵云, 曹操, 刘备, 孙权]
// [刘备, 诸葛亮, 关羽, 赵云, 曹操, 刘备, 孙权]
// [刘备, 关羽, 赵云, 曹操, 刘备, 孙权]
// [曹操, 关羽, 赵云, 曹操, 刘备, 孙权]
// true
// false
// true
// 6
// 曹操
// []
}

2、Set 集合

基本特征

  • ​Dart​​​ 中集合用 ​​{}​​​ 进行定义,通过 ​​,​​ 来分隔元素。
  • ​Set​​​ 和数学中 ​​集合​​​的概念一样,可容纳若干个元素,且 ​​不包含相同元素​​。
  • ​Set​​​ 是无序的,没有索引的概念,所以无法通过 ​​[]​​ 对元素进行访问和修改。
  • 而 ​​List​​ 允许包含相同元素,和索引访问,这就是两者最大的区别。

基本示例

main() {
Set<String> set = { '刘备', '关羽', '张飞' };
print(set); // {刘备, 关羽, 张飞}
}

对集合常用操作

main() {
Set<String> set = {'刘备', '关羽', '张飞'};
print(set); // {刘备, 关羽, 张飞}
// 1、添加元素
set.add('赵云');
print(set); // {刘备, 关羽, 张飞, 赵云}
// 1.1 添加多个元素
set.addAll({'马超', '黄忠'});
print(set); // {刘备, 关羽, 张飞, 赵云, 马超, 黄忠}
// 2、删除元素
set.remove('张飞');
print(set); // {刘备, 关羽, 赵云}
// 2.1 删除多个元素
set.removeAll({'刘备', '关羽'});
print(set); // {赵云}
// 3、判断元素是否存在
print(set.contains('赵云')); // true
print(set.contains('张飞')); // false
// 4、获取元素个数
print(set.length); // 3
// 5、遍历元素
set.forEach((element) {
print(element);
});
// 赵云
// 马超
// 黄忠
// 6、转换为List
List<String> list = set.toList();
print(list); // [赵云, 马超, 黄忠]
// 7、交集
Set<String> set1 = {'赵云', '马超', '黄忠'};
Set<String> set2 = {'赵云', '马超', '黄忠', '张飞'};
print(set1.intersection(set2)); // {赵云, 马超, 黄忠}
// 8、并集
print(set1.union(set2)); // {赵云, 马超, 黄忠, 张飞}
// 9、差集
print(set1.difference(set2)); // {}
print(set2.difference(set1)); // {张飞}
// 10、查找元素
print(set1.lookup('赵云')); // 赵云
print(set1.lookup('张飞')); // null
// 11、判断是否为空
print(set1.isEmpty); // false
print(set1.isNotEmpty); // true
// 12、清空
set1.clear();
print(set1); // {}
}

3、Map 映射

概述

把一个事物,与另一个事物相对应,这本身就是 ​​映射​​ 。映射记录的是两个事物之间的联系

基本示例

main() {
Map<String, String> map = {
'name': '訾博',
'age': '26',
};
print(map); // {name: 訾博, age: 26}
}

对映射的常用操作

main() {
Map<String, String> map = {
'name': '訾博',
'age': '26',
};
print(map); // {name: 訾博, age: 26}
// 1、遍历 map
map.forEach((key, value) {
print('$key: $value');
});
// 2、获取所有的 key
print(map.keys); // (name, age)
// 3、获取所有的 value
print(map.values); // (訾博, 26)
// 4、判断是否包含某个 key
print(map.containsKey('name')); // true
// 5、判断是否包含某个 value
print(map.containsValue('訾博')); // true
// 6、获取长度
print(map.length); // 2
// 7、判断是否为空
print(map.isEmpty); // false
// 8、判断是否不为空
print(map.isNotEmpty); // true
// 9、删除某个 key
map.remove('name');
print(map); // {age: 26}
// 10、清空 map
map.clear();
print(map); // {}
// 11、添加元素
map['name'] = '訾博';
map['age'] = '26';
print(map); // {name: 訾博, age: 26}
// 12、获取某个 key 的 value
print(map['name']); // 訾博
// 13、获取某个 key 的 value,如果不存在则返回默认值
print(map.putIfAbsent('name', () => '訾博')); // 訾博
// 14、修改某个 key 的 value
map.update('name', (value) => '訾博');
print(map); // {name: 訾博, age: 26}
// 15、修改某个 key 的 value,如果不存在则添加
map.update('name', (value) => '訾博', ifAbsent: () => '訾博');
print(map); // {name: 訾博, age: 26}
// 16、删除某个 key value 对
map.remove('name');
print(map); // {age: 26}
}

4、三种聚合类型的关系

首先 ​​List​​​ 和 ​​Set​​​ 之间可以相互转化。我们前面知道,​​Set​​​ 中的元素是不重复的,所以如果 ​​List​​​ 中有重复的元素,通过 ​​toSet​​​ 方法转化为 ​​Set​​​ 之后,可以去除重复元素,再把 ​​Set​​​ 通过 ​​toList​​​ 转化为 ​​List​​​ ,就可以达到 ​​去重​​ 的需求。

其次,​​List​​​ 通过 ​​asMap​​​ 方法可以返回一个 ​​Map​​ 对象。其中键是索引,值是元素值

然后,通过 ​​Map.fromIterables​​ 方法,可以根据两个可迭代对象创建映射对象,前者是 ​​key​​​ ,后者是 ​​value​​​ 。其中 ​​List​​​ 和 ​​Set​​ 都是可迭代对象,可以作为入参。

最后,​​Map​​​ 对象可以通过 ​​keys​​​ 和 ​​values​​ 获取可迭代对象,再通过 ​​toList​​​ 和 ​​toSet​​​ 就可以获得 ​​List​​​ 和 ​​Set​​ 对象。


举报

相关推荐

0 条评论