【Scala专栏】字符串与集合
创始人
2024-03-13 03:30:30

本文索引

  • 一、String/StringBuilder
  • 二、Array
  • 三、List
  • 四、Set
  • 五、Map
  • 六、Tuple

  Scala中的字符串在本质上就是Java的字符串String,
在这里插入图片描述
所以在用法上除了要符合Scala的语法以外,其他方面是如出一辙的。
  Scala中的集合分为可变和不可变,默认声明的结果是不可变的。
  不可变和可变指的是:当集合进行增删操作(长度发生变化)时,不可变集合会返回新的集合,原集合不会变化,而可变集合会在原集合上进行修改。

一、String/StringBuilder

object Lesson_String {def main(args: Array[String]): Unit = {val str = "abcd"val str1 = new String("abcd")// Java/Scala输出都是trueprintln(str.equals(str1))// Scala输出是true, Java中这个是falseprintln(str == str1)val str2 = "ABCD"// 忽视大小写的匹配,输出trueprintln(str.equalsIgnoreCase(str2))// b的indexprintln(str.indexOf(98))println(str.indexOf("bd"))/** StringBuilder * */// Scala中无参构造可以不写()
//    val strBuilder = new StringBuilderval strBuilder = new StringBuilder()strBuilder.append("abc")strBuilder + 'd'// 字符串用++=strBuilder ++= "efg"strBuilder += 'h'strBuilder.append(1.0)strBuilder.append(18f)println(s"strBuilder: $strBuilder")}
}

println(s"strBuilder: $strBuilder"),这是一种占位符填充式的String字符串拼接的方式,是一个语法糖,比起直接用"+"来拼接字符串能更加优雅

二、Array

创建一维数组并赋值

val arr1 = new Array[Int](3)
arr1(0) = 10   // 等价于Java: arr1[0] = 10;
// 创建String类型的数组,直接赋值: 其本质是会去调Array对象中重写的apply()方法
val arr2 = Array[String]("s100", "s200", "s300")
// 源码:
/*    def apply[T: ClassTag](xs: T*): Array[T] = {val array = new Array[T](xs.length)var i = 0for (x <- xs.iterator) { array(i) = x; i += 1 }array}*/

创建二维数组并赋值

val twoDimenArray = new Array[Array[Int]](3)
twoDimenArray(0) = Array[Int](1, 2, 3, 4)
twoDimenArray(1) = Array[Int](5, 6, 7, 8)
twoDimenArray(2) = Array[Int](9, 10, 11, 12)

concat函数: 拼接Array

Array.concat(arr3, arr4).foreach(println)

fill函数: 初始化不可变Array

val immutableArray = Array.fill(3)("hello1")
immutableArray.foreach(println)

初始化可变的Array

 val mutableArray = ArrayBuffer[String]("hello","scala")mutableArray.+=("!")mutableArray.+=:("!")mutableArray.append("!","!")mutableArray.foreach(println)

三、List

创建list

val list = List[String]("hello scala", "hello java", "hello spark")

map函数 => n:m输入输出

val splitList: List[Array[String]] = list.map(ele => ele.split(" "))

flatMap => n:1输入输出

val flatSplitList: List[String] = list.flatMap(ele => ele.split(" "))

filter => true的会留下

val filterList: List[String] = list.filter(ele => {"hello scala".equals(ele)
})

count => 统计true的element数量

val count: Int = list.count(ele => {ele.length > 7
})

可变的List

val listBuffer: ListBuffer[Int] = ListBuffer[Int](1, 2, 3)
listBuffer.append(7)
listBuffer.+=:(-1)
println(s"listBuffer: $listBuffer")

笔者注:以上这些流式计算的函数,可以在编程时大大减少代码的编写量,效果很强大,也是函数式编程的一大特点。 Java8中的stream流也是借鉴了这种函数编程的思想而出现的。 不仅是List集合,对于其他集合也是一样的使用,未来在使用flink/spark等流批统一的计算框架时,会经常用到

四、Set

创建Set

val set: Set[Int] = Set[Int](1, 2, 3, 4, 4, 5)
val set1: Set[Int] = Set[Int](4, 5)

取交集/差集/并集

// 取交集
val set2: Set[Int] = set.intersect(set1)
println(set2)
// 差集: set - set1
val set3: Set[Int] = set.diff(set1)
println(set3)
// 操作符: &取交集
val set4: Set[Int] = set & set1
println(set4)
// 操作符: &~diff
val set5: Set[Int] = set &~ set1
println(set5)
// 操作符: |取并集
val set6: Set[Int] = set | set1
println(set6)

filter: true的会留下

val filterSet: Set[Int] = set.filter(ele => {ele > 2
})
println(filterSet)

可变Set

val mutableSet: mutable.Set[Int] = mutable.Set[Int](7, 7, 7)
mutableSet.+=(77)
println(mutableSet)

五、Map

Map中的每个元素,实际上的存储结构其实是Tuble_2(2元组)类型,这个数据类型等下会提到,我们先来上手Map的Api

创建map

val map = Map[String, Int]("a" -> 100, "b" -> 200,("c", 300),("c", 400))

map中直接get(“key”)返回是Option类型,这个类型是Some(有值)/None(无值)的父类

返回Some

// Some(100)
val elementA: Option[Int] = map.get("a")
println(elementA)
val aValue: Int = elementA.get
println(aValue)

返回None

val elementD: Option[Int] = map.get("d")

获取值并赋予默认值

// getOrElse
val dDefaultValue: Int = elementD.getOrElse(777)
println(dDefaultValue)

获取keys

// keys
val keys: Iterable[String] = map.keys
keys.foreach(println)

根据keys遍历得到values

keys.foreach(key => {val value = map(key)println(s"key=$key,value=$value")
})

直接获取values

val values: Iterable[Int] = map.values
values.foreach(value => println(s"value=$value"))

合并map

// map.++()
val map1 = Map[String,Int](("a",1),("b",2),("c",3),("d",4))
val map2 = Map[String,Int](("a",100),("b",200),("c",300),("e",500))
val map3: Map[String, Int] = map1.++(map2)

可变的map

val mutableMap = mutable.Map[String,Int](("a",1),("b",2),("c",3),("d",4),("e",5))
mutableMap.put("a",100)

filter函数

val mapFilter: mutable.Map[String, Int] = mutableMap.filter(tuple => {"a".equals(tuple._1) && 100 == (tuple._2)
})

六、Tuple

Tuple,同Python中的Tuple一样的概念,但是Scala中最多支持Tuple中有22个元素,也就是Tuple22,而Python中则没有这个限制。

什么是元组?

一堆元素放在一个()里面
与列表一样,与列表不同的是元组可以包含不同类型的元素.元组的值是通过将单个的值包含在圆括号中构成的.
元组可以new, 也可以不new, 也可以直接写(ele1,ele*)

创建元组

val tuple1: Tuple1[String] = new Tuple1("hello tuple")
val tuple2: (String, Int) = new Tuple2("hello tuple", 100)
val tuple3: (Int, Boolean, Char) = new Tuple3(1, true, 'C')
// 类似object.apply()的实现方式, 但其实是class
val tuple4: (Int, Double, String, Boolean) = Tuple4(1, 3.4, "abc", false)
val tuple6: (Int, Int, Int, Int, Int, String) = (1, 2, 3, 4, 5, "abc")
// 最大的tuple
val tuple22 = new Tuple22(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22)

遍历元组:不能通过for循环遍历,只能通过iterator迭代器遍历

val tupleIterator: Iterator[Any] = tuple6.productIterator    while(tupleIterator.hasNext){println(tupleIterator.next())
}
tupleIterator.foreach(println)

对于二元组Tuple2特有的交换2个元素的方法Tuple2.swap

val tuple2 = Tuple2(1,2)
tuple2.swap
// 这里会输出(2,1)

scala中的下划线_有2个作用,一个是在遍历时指代集合中的每一个元素,例如有这样一个迭代器Iterator((3,1),(2,3)),就可以用在遍历时用_代替里面的元组元素,例如:

val tupleIterator = Iterator((3,1),(2,3))
tupleIterator.foreach(println(_))
上面这行可以进一步简化为: tupleIterator.foreach(println)

下划线_还有一个作用是用来获取元组中的元素,比如有这样一个二元组tuple2 = (1,3),那么我们用tuple2_2就可以获取到其中的元素3

出个小作业,下面这行输出的结果是什么?答案请分享在评论区

知识补充: minBy可以根据元素的位置输出最小值

val t: (Int, Iterator[(Int,Int)]) = (122,Iterator[(Int,Int)]((3,1),(2,3)))
val tuple: (Int, Int) = t._2.minBy(_._2)
println(tuple)

今天的内容也比较多,要认真学习和理解哦,我们下期再见!

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...