Scala—数组(数组定义、数组常用方法等)— 用法详解
Scala
Scala-数组-用法详解
- Scala
- 一、数组的定义
- 1. `new` 关键字
- 2. `Array` 对象的 `apply` 方法
- 3. 创建多维数组
- 二、数组常用方法
- 1. `length`:获取数组的长度。
- 2. `apply`:通过索引获取数组中的元素。
- 3. `update`:通过索引更新数组中的元素。
- 4. `foreach`:遍历数组中的每个元素。
- 5. `map`:对数组中的每个元素应用一个函数,并返回一个新的数组。
- 6. `filter`:过滤数组中的元素,返回一个新的数组。
- 7. `foldLeft`:从左到右累积数组中的元素。(fold、foldRight)
- 8. `reduce`:将数组中的元素减少为一个单一的值。
- 9. `mkString`:将数组中的元素连接成一个字符串。
- 10. `sortWith`:根据给定的比较函数对数组进行排序。
- 11. `zip`:将两个数组配对成一个元组数组。
- 12. `contains`:检查数组是否包含某个元素。
- 13. `indexOf`:查找数组中某个元素的第一个索引。
- 14. `slice`:提取数组的一个子数组。
- 15. `concat`:连接两个数组。
- 16. `reverse`:反转数组。
- 17. `distinct`:去除数组中的重复元素。
- 18. `exists`:检查数组中是否存在满足条件的元素。
- 19. `forall`:检查数组中的所有元素是否都满足某个条件。
- 20. `find`:查找数组中第一个满足条件的元素,返回 `Option` 类型。
- 21. `count`:计算数组中满足条件的元素的数量。
- 22. `min` 和 `max`:分别返回数组中的最小值和最大值。
- 23. `sum` 和 `product`:分别返回数组中所有元素的总和和乘积。
- 24. `partition`:将数组分为两个数组,一个包含满足条件的元素,另一个包含不满足条件的元素。
- 25. `groupBy`:根据某个条件将数组中的元素分组。
- 26. `flatMap`:对数组中的每个元素应用一个函数,并将结果展平为一个数组。
- 27. `take` 和 `drop`:返回数组的前 `n` 个元素和去掉前 `n` 个元素后的剩余部分。
- 28. `toArray`:将其他集合类型转换为数组。
- 29. `toSeq` 和 `toList`:将数组转换为 `Seq` 或 `List`。
- 30. `copyToArray`:将数组的一部分复制到另一个数组中。
- 整理不易,列位还请多多支持呀🤣🤣🤣🤣点赞 收藏 关注~
一、数组的定义
Scala
中数组是一种可以存储固定数量相同类型元素的数据结构。
Scala
提供了多种定义数组的方法,下面博主就总结一下常用的哈(够用啦~🤣🤣🤣)
1. new
关键字
val arrayName = new Array[ElementType](size)
- 类型参数:
ElementType
指定数组中元素的类型,Int
,String
,Double
等。 - 大小:
size
指定数组的长度——正整数。 - 默认值:对于基本类型,数组元素会被初始化为该类型的默认值(如
Int
的默认值是0
,Boolean
的默认值是false
)。对于引用类型,数组元素会被初始化为null
。
Scala 3.x 数据类型、类型层次结构详解—链接
Demo:
2. Array
对象的 apply
方法
val arrayName = Array(element1, element2, ..., elementN)
- 直接列出数组中的所有元素,用逗号分隔。
- 编译器会根据提供的元素自动推断数组的类型。
为什么看起来没有显式调用 apply
方法?
- 隐式调用
apply
方法——代码更加简洁和易读,符合 Scala 的设计哲学。 - 许多 Scala 标准库中的类和对象都提供了类似的
apply
方法——创建实例的语法一致。
这两段代码实际上是等价的。编译器会将 Array(1, 2, 3)
转换为 Array.apply(1, 2, 3)
。
如果数组包含不同类型元素,Scala如何处理嘞?
Tips:🤣🤣🤣🤣
1. 类型提升
如果数组中的元素类型是数值类型(如 Int
, Double
, Float
, Long
等),编译器会尝试将所有元素提升到一个共同的数值类型。
- 整数类型:
Byte
->Short
->Int
->Long
- 浮点类型:
Float
->Double
- 混合类型:如果数组中既有整数类型又有浮点类型,所有整数类型会被提升为浮点类型。
Demo🤣🤣🤣🤣:
2. 找公共父类
如果数组中的元素类型不是数值类型,或者无法通过类型提升来统一类型,编译器会找到这些类型的最近公共父类。
- 基本类型和引用类型:如果数组中既有基本类型又有引用类型,公共父类是
Any
。 - 引用类型:如果数组中的元素类型都是引用类型,编译器会找到这些类型的最近公共父类。
Scala 3.x 数据类型、类型层次结构详解—链接
Demo🤣🤣🤣🤣:
数组中既有基本类型又有引用类型,公共父类是 Any
。
数组中的元素类型都是引用类型,编译器会找到这些类型的最近公共父类。
3. 创建多维数组
val arrayName = Array.ofDim[ElementType](dim1, dim2, ..., dimN)
or
var array_name = Array(Array(elements), Array(elements)
- 多维:可以创建一维、二维甚至更高维度的数组。
- 尺寸:每个维度的大小由参数
dim1
,dim2
, … 指定。 - 默认值:所有元素会被初始化为该类型的默认值。
Demo🤣🤣🤣🤣:
二、数组常用方法
家人们,方法太多啦,介绍一些常用的🤣🤣🤣
有些方法不仅仅是数组可以用奥,Scala中一些其他的集合(数组、列表、向量等)也可以使用!🤣🤣🤣
1. length
:获取数组的长度。
2. apply
:通过索引获取数组中的元素。
val element = arr(index)
- 隐式调用
apply
方法:arr(0)
是arr.apply(0)
的语法糖(Syntactic Sugar
)——对底层更复杂语法的一种简化表示。
- 显式调用
apply
方法:arr.apply(0)
明确地调用了Array
对象的apply
方法。
3. update
:通过索引更新数组中的元素。
arr(index) = value
等价于:
arr.update(index, value)
index
:要更新的元素的索引。value
:新的值。
- 隐式调用:
arr(0) = 10
是arr.update(0, 10)
的语法糖(Syntactic Sugar
)——对底层更复杂语法的一种简化表示。。 - 显式调用:
arr.update(0, 10)
明确地调用了Array
对象的update
方法。
4. foreach
:遍历数组中的每个元素。
foreach
:用于遍历数组中的每个元素,并对每个元素执行某个操作。
array.foreach(f: (T) => Unit)
-
array
:要遍历的数组。 -
f
:一个函数,接受一个参数(数组中的元素),并返回Unit
(相当于 Java 中的void
)。 -
参数:接受一个函数作为参数——如何处理每个元素。
-
返回值:
foreach
方法本身返回Unit
,因为其主要用于执行带有"副作用"的操作(如打印、累加等)。
Demo🤣🤣🤣:
1. 带有操作的 foreach
2. 带有"副作用"的操作
3. 使用 foreach
进行过滤和打印
x => println(x)
是一个匿名函数,接受一个参数x
并打印它。arr.foreach(println)
是简化的形式,直接将println
作为函数传递给foreach
。
5. map
:对数组中的每个元素应用一个函数,并返回一个新的数组。
val newArr = arr.map(f: (T) => U)
arr
:原始数组。f
:一个函数,接受一个参数(数组中的元素),并返回一个新的值。newArr
:应用函数后的新数组。
1. 使用简化的匿名函数
在_ * 2
是一个简化的匿名函数,等价于 x => x * 2
。
2. 复杂的映射操作
map
方法将数组中的每个字符串转换为大写。
3. 多参数映射操作
使用 map
方法处理元组:将每个元组的第一个元素乘以 2,并将第二个元素转换为大写。
4. 嵌套的 map
操作
使用嵌套的 map
方法来处理二维数组的每个子数组。
外层的 map
方法处理每个子数组,内层的 map
方法处理子数组中的每个元素。
6. filter
:过滤数组中的元素,返回一个新的数组。
val newArr = arr.filter(p: (T) => Boolean)
arr
:原始数组。p
:一个谓词函数(Predicate Function),接受一个参数(数组中的元素),并返回一个布尔值,表示该元素是否满足条件。newArr
:包含满足条件的元素的新数组。
Demo:
1.使用简化的匿名函数
_ % 2 == 0
是 x => x % 2 == 0
的简写形式,更加简洁🤣🤣🤣。
2. 复杂的过滤条件
筛选出长度大于 5 的字符串,并返回一个新的数组:
3. 组合多个条件
筛选出大于 4 的偶数,并返回一个新的数组。
4. filterNot
方法
filterNot
方法与 filter
方法相反,返回不满足条件的元素。
7. foldLeft
:从左到右累积数组中的元素。(fold、foldRight)
1.累计和
arr.foldLeft(0)((acc, x) => acc + x)
:0
是初始值,表示累积结果的初始状态。(acc, x) => acc + x
是一个匿名函数,接受两个参数:acc
:累积结果,初始值为 0。x
:当前元素,即数组中的每个元素。
- 函数体
acc + x
表示将当前元素x
加到累积结果acc
上。
2. 计算乘积
arr.foldLeft(1)((acc, x) => acc * x)
:1
是初始值,表示累积结果的初始状态。(acc, x) => acc * x
是一个匿名函数,接受两个参数:acc
:累积结果,初始值为 1。x
:当前元素,即数组中的每个元素。
- 函数体
acc * x
表示将当前元素x
乘到累积结果acc
上。
3. 字符串连接
arr.foldLeft("")((acc, x) => acc + x)
:""
是初始值,表示累积结果的初始状态,这里是一个空字符串。(acc, x) => acc + x
是一个匿名函数,接受两个参数:acc
:累积结果,初始值为一个空字符串。x
:当前元素,即数组中的每个字符串。
- 函数体
acc + x
表示将当前字符串x
连接到累积结果acc
上。
Tips🤣🤣🤣:也可以使用其他名称来代替 acc
和 x
,只要它们在函数体内有意义即可。
total
:累积结果,初始值为 0。num
:当前元素,数组中的每个元素。
result
:累积结果,初始值为 1。num
:当前元素,数组中的每个元素。
str
:累积结果,初始值为一个空字符串。word
:当前元素,数组中的每个字符串。
Tips:fold、foldRight用法同理哈
特性 | fold (一般) | foldLeft | foldRight |
---|---|---|---|
方向 | 可能是并行的,不保证顺序 | 从左到右累积 | 从右到左累积 |
顺序保证 | 可能不保证顺序(并行时) | 保证从左到右的顺序 | 保证从右到左的顺序 |
初始值 | 需要初始值 | 需要初始值 | 需要初始值 |
常见用途 | 通用折叠操作(支持并行) | 保证顺序的累积操作 | 需要从右到左处理数据的场景 |
val result = arr.fold(initialValue)(operation)
arr
:原始数组。initialValue
:累积的初始值。operation
:一个二元操作符,接受两个参数(累积结果和当前元素),并返回一个新的累积
8. reduce
:将数组中的元素减少为一个单一的值。
reduce
会自动选择列表中的第一个和第二个元素进行合并,再将结果与第三个元素进行合并,依此类推。
2. reduce
和上面咱们提到的 fold
的差不多哈🤣:
- 功能:都用于对集合中的元素进行“折叠”操作,将集合的元素通过某种二元操作(如加法、乘法等)合并为一个单一的结果。
- 高阶函数:两者都是高阶函数,需要一个二元函数作为参数,这个函数定义了如何合并两个元素。
- 返回类型:返回类型是集合元素的类型,而不是某种通用的类型,比如
reduce
和fold
都返回与集合元素相同类型的结果。
3. fold
和 reduce
的区别:
特性 | reduce | fold |
---|---|---|
初始值 | 不需要初始值 | 需要一个初始值(可以是任意类型) |
空集合 | 对于空集合,reduce 会抛出异常 | 对于空集合,fold 会返回初始值 |
灵活性 | 只能使用集合中已有的元素类型进行操作 | 可以使用任何类型作为初始值(类型灵活) |
适用场景 | 用于确保集合中有元素的情况下,进行合并操作 | 用于需要初始化值的情况,尤其是处理空集合时 |
空集合的情况:
reduce
:如果集合为空,reduce
会抛出异常UnsupportedOperationException
,因为它没有初始值来进行折叠。
fold
:对于空集合,fold
会返回你提供的初始值。
- 使用
reduce
:当确定集合不为空,并且只需要根据元素类型进行折叠时,reduce
更简洁。 - 使用
fold
:当需要处理空集合或者想要指定初始值时,fold
是更安全且灵活的选择。
9. mkString
:将数组中的元素连接成一个字符串。
将集合中的元素转换为一个字符串,并可以选择在元素之间插入分隔符。
val result = coll.mkString(sep: String)
coll
:原始集合。sep
:元素之间的分隔符。
Demo:
mkString
方法有多种重载形式:
- 无参数:将所有元素连接成一个字符串,没有分隔符。
- 一个参数:将所有元素连接成一个字符串,并在元素之间插入指定的分隔符。
- 三个参数:在结果字符串的开头和结尾添加指定的前缀和后缀,并在元素之间插入指定的分隔符。
mkString
方法适用于各种集合类型,如数组、列表、向量等。
1. 列表
2. 向量
3. 集合
10. sortWith
:根据给定的比较函数对数组进行排序。
val sortedArray = arr.sortWith(comparisonFunction)
arr
:原始数组。comparisonFunction
:一个布尔函数,接受两个参数(a
和b
),并返回一个布尔值。如果a
应该排在b
前面,则返回true
,否则返回false
。
话不多说 上 Demo🤣🤣🤣:
1. 升序排序整数数组
- 两个参数(
a
和b
),并返回一个布尔值。如果a
应该排在b
前面,则返回true
,否则返回false
。
2. 降序排序整数数组
- 两个参数(
a
和b
),并返回一个布尔值。如果a
应该排在b
前面,则返回true
,否则返回false
。
3. 按字符串长度排序
- 两个参数(
a
和b
),并返回一个布尔值。如果a
应该排在b
前面,则返回true
,否则返回false
。
4. 按对象属性排序
11. zip
:将两个数组配对成一个元组数组。
zip
——将两个相同长度的数组组合成一个新的数组,其中每个元素都是一个元组,元组的第一个元素来自第一个数组,第二个元素来自第二个数组。
val zippedArray = arr1.zip(arr2)
arr1
:第一个数组。arr2
:第二个数组。zippedArray
:结果数组,其中每个元素是一个元组(arr1(i), arr2(i))
。
Tips:不同长度的数组
如果两个数组的长度不同,zip
方法会以较短的数组为准,多余的元素会被忽略。
12. contains
:检查数组是否包含某个元素。
contains
——检查数组是否包含某个特定的元素。
val result = arr.contains(element)
arr
:原始数组。element
:要检查的元素。result
:布尔值,表示数组是否包含指定的元素。
13. indexOf
:查找数组中某个元素的第一个索引。
val index = arr.indexOf(element)
arr
:原始数组。element
:要查找的元素。index
:返回的索引值,如果找到元素则返回其索引,否则返回-1
。
14. slice
:提取数组的一个子数组。
val subArray = arr.slice(start, end)
arr
:原始数组。start
:子数组的起始索引(包含)。end
:子数组的结束索引(不包含)。subArray
:返回的新数组,包含arr
中从start
到end - 1
的元素。
Demo:
如果提供的索引超出了数组的范围,slice
方法会自动调整索引,确保不会抛出异常。
15. concat
:连接两个数组。
val concatenatedArray = Array.concat(arr1, arr2)
arr1
:第一个数组。arr2
:第二个数组。concatenatedArray
:返回的新数组,包含arr1
和arr2
的所有元素。
1. 连接整数数组
2. 连接字符串数组
3. 连接多个数组
16. reverse
:反转数组。
val reversedArray = arr.reverse
arr
:原始数组。reversedArray
:返回的新数组,包含arr
中元素的反向顺序。
1. 反转整数数组
2. 反转字符串数组
17. distinct
:去除数组中的重复元素。
val uniqueArray = arr.distinct
arr
:原始数组。uniqueArray
:返回的新数组,包含arr
中的所有唯一元素。
1. 去除整数数组中的重复元素
2. 去除字符串数组中的重复元素
3. 去除对象数组中的重复元素
18. exists
:检查数组中是否存在满足条件的元素。
val result = arr.exists(predicate)
arr
:原始数组。predicate
:一个谓词函数,接受一个元素作为参数,并返回一个布尔值。result
:布尔值,表示数组中是否存在至少一个元素满足predicate
函数的条件。
1. 检查整数数组中是否存在偶数
2. 检查字符串数组中是否存在以 “a” 开头的字符串
3. 检查对象数组中是否存在年龄大于 30 的人
19. forall
:检查数组中的所有元素是否都满足某个条件。
val result = arr.forall(predicate)
arr
:原始数组。predicate
:一个谓词函数,接受一个元素作为参数,并返回一个布尔值。result
:布尔值,表示数组中的所有元素是否都满足predicate
函数的条件。
1. 检查整数数组中所有元素是否都小于 10
2. 检查字符串数组中所有元素是否都以 “a” 开头
3. 检查对象数组中所有人的年龄是否都大于 20
20. find
:查找数组中第一个满足条件的元素,返回 Option
类型。
val result: Option[Element] = arr.find(predicate)
arr
:原始数组。predicate
:一个谓词函数,接受一个元素作为参数,并返回一个布尔值。result
:Option
类型的结果,表示数组中第一个满足predicate
函数条件的元素。如果找到了满足条件的元素,则返回Some(element)
,否则返回None
。
1. 查找整数数组中第一个偶数
2. 查找字符串数组中第一个以 “a” 开头的字符串
3. 查找对象数组中第一个年龄大于 30 的人
21. count
:计算数组中满足条件的元素的数量。
val count = arr.count(predicate)
arr
:原始数组。predicate
:一个谓词函数,接受一个元素作为参数,并返回一个布尔值。count
:整数,表示数组中满足predicate
函数条件的元素的数量。
1. 计算整数数组中偶数的数量
2. 计算字符串数组中以 “a” 开头的字符串的数量
3. 计算对象数组中年龄大于 30 的人的数量
22. min
和 max
:分别返回数组中的最小值和最大值。
val minValue = arr.min
val maxValue = arr.max
arr
:原始数组。minValue
:数组中的最小值。maxValue
:数组中的最大值。
1. 整数数组
2. 浮点数数组
3. 字符串数组(基于字典序)
23. sum
和 product
:分别返回数组中所有元素的总和和乘积。
val totalSum = arr.sum
val totalProduct = arr.product
arr
:原始数组。totalSum
:数组中所有元素的总和。totalProduct
:数组中所有元素的乘积。
24. partition
:将数组分为两个数组,一个包含满足条件的元素,另一个包含不满足条件的元素。
val (satisfyingElements, nonSatisfyingElements) = arr.partition(predicate)
arr
:原始数组。predicate
:一个谓词函数,接受一个元素作为参数,并返回一个布尔值。satisfyingElements
:包含满足predicate
函数条件的元素的数组。nonSatisfyingElements
:包含不满足predicate
函数条件的元素的数组。
1. 分割整数数组
2. 分割字符串数组
,
arr.partition(_.startsWith("a"))
将数组 arr
分为两个数组:startsWithA
包含所有以 “a” 开头的字符串,notStartsWithA
包含所有不以 “a” 开头的字符串。
3. 分割对象数组
people.partition(_.age > 30)
将数组 people
分为两个数组:olderThan30
包含所有年龄大于 或 等于30 的人,youngerOrEqual30
包含所有年龄小于 30 的人。
25. groupBy
:根据某个条件将数组中的元素分组。
val grouped = arr.groupBy(keyFunction)
arr
:原始数组。keyFunction
:一个函数,接受一个元素作为参数,并返回一个键(通常是某种类型的值)。grouped
:一个映射(Map),键是分组的依据,值是属于该组的元素列表。
1. 根据整数的奇偶性分组
2. 根据字符串的首字母分组
3. 根据对象的属性分组
26. flatMap
:对数组中的每个元素应用一个函数,并将结果展平为一个数组。
val result = arr.flatMap(function)
arr
:原始数组。function
:一个函数,接受一个元素作为参数,并返回一个集合(如数组、列表等)。result
:一个展平后的数组,包含所有应用函数后得到的元素。
1. 将每个字符串拆分为字符数组
2. 将每个整数乘以 2 并生成一个新的数组
27. take
和 drop
:返回数组的前 n
个元素和去掉前 n
个元素后的剩余部分。
val firstNElements = arr.take(n)
val remainingElements = arr.drop(n)
arr
:原始数组。n
:要取或去掉的元素数量。firstNElements
:包含数组前n
个元素的新数组。remainingElements
:包含去掉前n
个元素后的剩余部分的新数组。
1. 整数数组
2. 字符串数组
28. toArray
:将其他集合类型转换为数组。
val array = collection.toArray
collection
:原始集合,可以是列表、集合、映射等。array
:转换后的数组。
1. 列表转换为数组
2. 集合转换为数组
集合是无序的,所以输出的顺序可能与插入顺序不同。
3. 映射转换为数组
数组中的每个元素是一个元组,表示映射中的键值对。
29. toSeq
和 toList
:将数组转换为 Seq
或 List
。
30. copyToArray
:将数组的一部分复制到另一个数组中。
src.copyToArray(dest, destIndex, length)
src
:源数组,从中复制元素。dest
:目标数组,将元素复制到此数组中。destIndex
:目标数组中的起始索引,从该索引开始复制元素。length
:要复制的元素数量。
src.copyToArray(dest, 2, 5)
将源数组 src
的前 5 个元素复制到目标数组 dest
的索引 2 位置开始的位置。
src.copyToArray(dest, 0, 3)
将源数组 src
的前 3 个元素复制到目标数组 dest
的起始位置。
整理不易,列位还请多多支持呀🤣🤣🤣🤣点赞 收藏 关注~
相关文章:
Scala—数组(数组定义、数组常用方法等)— 用法详解
Scala Scala-数组-用法详解 Scala一、数组的定义1. new 关键字2. Array 对象的 apply 方法3. 创建多维数组 二、数组常用方法1. length:获取数组的长度。2. apply:通过索引获取数组中的元素。3. update:通过索引更新数组中的元素。4. foreach…...
使用 Elastic 收集 Windows 遥测数据:ETW Filebeat 输入简介
作者:来自 Elastic Chema Martinez 在安全领域,能够使用 Windows 主机的系统遥测数据为监控、故障排除和保护 IT 环境开辟了新的可能性。意识到这一点,Elastic 推出了专注于 Windows 事件跟踪 (ETW) 的新功能 - 这是一种强大的 Windows 原生机…...
二分排序
二分问题之前遇到很多次了,不过一直是手写完整二分,现在转变一下想法,直接使用函数lower_bound和upper_bound更方便 lower_bound 有序数组中 查找第一个不小于指定值的位置。 本质二分代码: int lower_bound_custom(int* arr, i…...
数据库---HSQLDB使用教程详解
本学校期末的课程设计要求使用HSQLDB数据库,作为一个小众且轻量的数据库,很少人接触过,再加上同学们都问这个方面,所以就出教程,展示怎么使用HSQLDB。 第一步:启动HSQLDB 下载HSQLDB的jar包,因…...
Makefile基础应用
1 使用场景 在Linux环境下,我们通常需要通过命令行来编译代码。例如,在使用gcc编译C语言代码时,需要使用以下命令。 gcc -o main main.c 使用这种方式编译代码非常吃力,每次调试代码都需要重新在命令行下重新编译,重复…...
一个点绕任意点旋转后的点的坐标
在平面坐标上,任意点P(x1,y1),绕一个坐标点Q(x2,y2)逆时针旋转θ角度后,新的坐标设为(x, y)的计算公式: x (x1 - x2)*cos(θ) - (y1 - y2)*sin(θ) x2 ; y (x1 - x2)*sin(θ) (y1 - y2)*cos(θ) y2 ; 另一个场景应用,坐标轴绕…...
嵌入式硬件杂谈(二)-芯片输入接入0.1uf电容的本质(退耦电容)
引言:对于嵌入式硬件这个庞大的知识体系而言,太多离散的知识点很容易疏漏,因此对于这些容易忘记甚至不明白的知识点做成一个梳理,供大家参考以及学习,本文主要针对芯片输入接入0.1uf电容的本质的知识点的进行学习。 目…...
算力100问☞第16问:什么是TPU?
TPU全称是Tensor Processing Unit芯片,中文全称是张量处理单元芯片,是谷歌开发的一种特殊类型的芯片,用于加速人工智能(AI)和机器学习(ML)工作负载。TPU主要针对张量(tensor…...
Level DB --- SkipList
class SkipList class SkipList 是Level DB中的重要数据结构,存储在memtable中的数据通过SkipList来存储和检索数据,它有优秀的读写性能,且和红黑树相比,更适合多线程的操作。 SkipList SkipList还是一个比较简单的数据结构&a…...
全面解析 JMeter 后置处理器:概念、工作原理与应用场景
在性能测试中,Apache JMeter是一个非常流行的工具,它不仅能够模拟大量用户进行并发访问,还提供了丰富的扩展机制来满足各种复杂的测试需求。后置处理器(Post-Processor)是JMeter中非常重要的组件之一,用于在…...
【视频】二维码识别:libzbar-dev、zbar-tools(zbarimg )
1、简介 ZBar可以使用多个方式识别各种条形码和二维码。 支持的格式有:EAN-13/UPC-A、UPC-E、EAN-8、Code 128、Code 93、Code 39、Codabar、Interleaved 2 of 5、QR Code和SQ Code 支持的来源有:视频流、图像文件等 libzbar-dev:二维码识别开发库 zbar-tools(zbarimg …...
EasyExcel: 结合springboot实现表格导出入(单/多sheet), 全字段校验,批次等操作(全)
全文目录,一步到位 1.前言简介1.1 链接传送门1.1.1 easyExcel传送门 2. Excel表格导入过程2.1 easyExcel的使用准备工作2.1.1 导入maven依赖2.1.2 建立一个util包2.1.3 ExcelUtils统一功能封装(单/多sheet导入)2.1.4 ExcelDataListener数据监听器2.1.5 ResponseHelper响应值处理…...
志愿者小程序源码社区网格志愿者服务小程序php
志愿者服务小程序源码开发方案:开发语言后端php,tp框架,前端是uniapp。 一 志愿者端-小程序: 申请成为志愿者,志愿者组织端进行审核。成为志愿者后,可以报名参加志愿者活动。 志愿者地图:可以…...
HTML实现 扫雷游戏
前言: 游戏起源与发展 扫雷游戏的雏形可追溯到 1973 年的 “方块(cube)” 游戏,后经改编出现了 “rlogic” 游戏,玩家需为指挥中心探出安全路线避开地雷。在此基础上,开发者汤姆・安德森编写出了扫雷游戏的…...
小白学多线程(持续更新中)
1.JDK中的线程池 JDK中创建线程池有一个最全的构造方法,里面七个参数如上所示。 执行流程分析: 模拟条件:10个核心线程数,200个最大线程数,阻塞队列大小为100。 当有小于十个任务要处理时,因为小于核心线…...
【uni-app多端】修复stmopjs下plus-websocket无心跳的问题
从这篇文章接着向下看: uniapp plus-websocket 和stompjs连接教程 安卓ios手机端有效 - 简书 按照文章的方式,能够实现APP下stmopjs长连接。但是有一个问题,就是会频繁输出 res-创建连接-1- 跟踪连接,会发现连接都会在大约40s后…...
【SLAM文献阅读】基于概率模型的视觉SLAM动态检测与数据关联方法
A dynamic detection and data association method based on probabilistic models for visual SLAM 《基于概率模型的视觉SLAM动态检测与数据关联方法》 2024 摘要: 通常,静态特征采用多视图几何来估计相机姿态和重建环境地图。因此,动态特…...
Linux系统使用valgrind分析C++程序内存资源使用情况
内存占用是我们开发的时候需要重点关注的一个问题,我们可以人工根据代码推理出一个消耗内存较大的函数,也可以推理出大概会消耗多少内存,但是这种方法不仅麻烦,而且得到的只是推理的数据,而不是实际的数据。 我们可以…...
Selenium+Java(19):使用IDEA的Selenium插件辅助超快速编写Pages
前言 或是惊叹于Selenium对于IDEA的支持已经达到了这样的地步,又或是由于这个好用的小工具的入口就在那里,它已经陪伴了我这么久,而我这么久的时间却都没有发现它。在突然发现这个功能的一瞬间,真的是喜悦感爆棚,于是赶快写下了这篇文章。希望可以帮助到其他同样在做UI自动…...
Unity 设计模式-单例模式(Singleton)详解
设计模式 设计模式 是指在软件开发中为解决常见问题而总结出的一套 可复用的解决方案。这些模式是经过长期实践证明有效的 编程经验总结,并可以在不同的项目中复用。设计模式并不是代码片段,而是对常见问题的 抽象解决方案,它提供了代码结构…...
OAuth协议详解
一、基本概念 OAuth(Open Authorization)是一种授权协议,用于允许第三方应用程序以受信任的方式访问用户的资源,而无需共享用户的身份验证凭据。OAuth协议的核心目标是在保持用户数据安全的前提下,简化用户在不同应用…...
2024收官之战:车展向下,智驾向上
作者 | 德新 编辑 | 王博 广州车展在上周拉开帷幕,在激烈的车市竞争中,可以说没有一届车展比本届更加「 冰火两重天」。 在本届车展前夕,已经传出不少车企集团面临业务整合的消息,一部分品牌缺席了本届车展,而势头强…...
开源项目-如何更好的参与开源项目开发
开源之谜-提升自我核心竞争力 一、寻找适合自己的开源项目二、像坐牢一样闭关修炼三、最后的实践 开源代码对所有人开放,开发者可以基于现有代码进行扩展和创新,而不是从零开始,参与开源项目可以提升自我的技术能力,丰富个人的经历…...
如何重命名 Conda 环境 - 详细教程
如何重命名 Conda 环境 - 详细教程 前言重命名步骤1. 克隆现有环境2. 验证新环境3. 删除旧环境 实例演示注意事项常见问题解答Q1: 为什么 Conda 没有直接的重命名命令?Q2: 重命名过程会影响环境中的包吗?Q3: 如果克隆过程中断,会怎么样&#…...
自动驾驶之激光雷达
这里写目录标题 1 什么是激光雷达2 激光雷达的关键参数3 激光雷达种类4 自动驾驶感知传感器5 激光雷达感知框架5.1 pointcloud_preprocess5.2 pointcloud_map_based_roi5.3 pointcloud_ground_detection5.4 lidar_detection5.5 lidar_detection_filter5.6 lidar_tracking 1 什么…...
Python毕业设计选题:基于python的豆瓣电影数据分析可视化系统-flask+spider
开发语言:Python框架:flaskPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 系统首页 个人中心 管理员登录界面 管理员功能界面 电影管理 用户管理 系统管理 摘要…...
从 Mac 远程控制 Windows:一站式配置与实践指南20241123
引言:跨平台操作的需求与挑战 随着办公场景的多样化,跨平台操作成为现代开发者和 IT 人员的刚需。从 Mac 系统远程控制 Windows,尤其是在同一局域网下,是一种高效解决方案。不仅能够灵活管理资源,还可以通过命令行简化…...
k8s部署Nginx详细教程
Kubernetes(简称k8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。本文将详细介绍如何使用k8s部署Nginx,包括创建部署配置、创建服务以及如何通过一个命令完成部署和删除。 环境准备 在开始之前&#x…...
PySpark3:pyspark.sql.functions常见的60个函数
目录 一、常见的60个函数 1、col 2、lit 3、sum 4、avg/mean 5、count 6、max 7、min 8、concat 9、substring 10、lower 11、upper 12、trim 13、ltrim 14、rtrim 15、split 16、explode 17、collect_list 18、collect_set 19、asc 20、desc 21、when 2…...
网络爬虫总结与未来方向
通过深入学习和实际操作,网络爬虫技术从基础到进阶得以系统掌握。本节将全面总结关键内容,并结合前沿技术趋势与最新资料,为开发者提供实用性强的深度思考和方案建议。 1. 网络爬虫技术发展趋势 1.1 趋势一:高性能分布式爬虫 随…...
【优先算法】专题——双指针
1.移动零 移动零 题目描述: 思路: 本题我们把数组分块,将非零元素移动到左边,为零元素移动右边。 我们使用双指针算法(利用数组下标来充当指针) 两个指针的作用: cur:从左往右…...
互联网时代的隐私保护
在这个数字化时代,我们的生活与互联网密不可分。打开手机刷刷朋友圈,浏览一下购物网站,约个网约车,点个外卖,这些看似平常的行为都在默默产生着数据足迹。可就在这不经意间,我们的个人信息正在被收集、分析…...
活着就好20241124
今天是周日,一个同样洋溢着休闲与宁静气息的日子。亲爱的朋友们,大家早上好!在经历了一周的忙碌之后,我们终于迎来了这个让人期待已久的休息日。周日,不仅是一个放松身心的绝佳时机,更是我们回归自我、享受…...
镁光MT25QU01GXXX norflash调试笔记
目录 前言一、芯片概述二、数据手册解释1. 数据手册获取2.内容概括 三、几个操作的代码1.复位芯片操作2.读取芯片ID3.擦除芯片扇区4.向芯片存入数据5.读取存储的数据6.其它操作函数 前言 本笔记总结如何使用MCU对nor flash进行数据存储,包括芯片基本介绍࿰…...
并行IO接口8255
文章目录 8255A芯片组成外设接口三个端口两组端口关于C口(★) 内部逻辑CPU接口 8255A的控制字(★)位控字(D70)方式选择控制字(D71) 8255A的工作方式工作方式0(基本输入/输…...
[Unity Demo]从零开始制作空洞骑士Hollow Knight第二十集:制作专门渲染HUD的相机HUD Camera和画布HUD Canvas
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作HUD Camera以及让两个相机同时渲染屏幕二、制作HUD Canvas 1.制作法力条Soul Orb引入库2.制作生命条Health读入数据3.制作吉欧统计数Geo Counter4.制作…...
《AI大模型开发笔记》——Prompt提示词最佳实践
为什么需要提示词优化 什么是 Prompt enginnering? 提示词:解释一下什么是大语言模型的Prompt enginnering 图1. 什么是Prompt Enginnering? 通过上面ChatGPT的说明,我们可以看到,prompt工程化就是如何写prompt提示…...
Frontend - 防止多次请求,避免重复请求
目录 一、避免重复执行的多种情况 (一)根据用途 (二)根据用户操作 二、具体实现 (一)“Ajax ”结合disabled (防止多次请求),避免多次点击重复请求 1. 适用场景 2. 解决办法 3. 示例 &…...
MongoDB 简介
MongoDB 简介 MongoDB 是一种流行的 NoSQL 数据库管理系统,以其灵活的数据模型、高性能和易于扩展的特点而闻名。本文将详细介绍 MongoDB 的基本概念、特点、使用场景以及如何在实践中应用。 1. MongoDB 基本概念 1.1 文档数据库 MongoDB 是一个文档数据库,它使用 JSON 风…...
Ngrok实现内网穿透(Windows)
Ngrok实现内网穿透(Windows) 什么是内网穿透,内网穿透有什么用 内网穿透(NAT traversal)是一种技术手段,使得位于内网或防火墙后面的设备能够通过外网访问。例如,如果你的计算机、服务器等设备…...
【Python-办公自动化】实现自动化输出模板表格报告
import pandas as pd import numpy as np# 定义时间范围 date_range = pd.date_range(start=2023-11-01, end=2024-10-31, freq=M...
医学AI公开课·第一期|Machine LearningTransformers in Med AI
小罗碎碎念 从这周开始,我计划每个周末录一个视频,分享一些医学人工智能领域的进展。 作为第一期视频,我打算介绍一下机器学习和Transformer在医学AI领域中的应用。 为了准备这期视频,总共做了24页PPT(三部分内容&…...
ESP8266 STA模式TCP服务器 电脑手机网络调试助手
STA模式TCP服务器和手机电脑网络调试助手多连接...
Transformer架构笔记
Attention is All You Need. 3.Model Architecture 3.1 整体架构如图 3.2 Encoder与Decoder Encoder:由 N 6 N6 N6个相同的Block/Layer堆叠而成。每个Block有两个子层sub-layer:多头注意力和MLP(FFN,前馈神经网络)&…...
初学 flutter 环境变量配置
一、jdk(jdk11) 1)配置环境变量 新增:JAVA_HOMEC:\Program Files\Java\jdk-11 //你的jdk目录 在path新增:%JAVA_HOME%\bin2)验证是否配置成功(cmd运行命令) java java -version …...
【大数据技术基础】 课程 第8章 数据仓库Hive的安装和使用 大数据基础编程、实验和案例教程(第2版)
第8章 数据仓库Hive的安装和使用 8.1 Hive的安装 8.1.1 下载安装文件 访问Hive官网(http://www.apache.org/dyn/closer.cgi/hive/)下载安装文件apache-hive-3.1.2-bin.tar.gz 下载完安装文件以后,需要对文件进行解压。按照Linux系统使用的…...
Postman之newman
系列文章目录 1.Postman之安装及汉化基本使用介绍 2.Postman之变量操作 3.Postman之数据提取 4.Postman之pm.test断言操作 5.Postman之newman Postman之newman 1.基础环境node安装1.1.配置环境变量1.2.安装newman和html报告组件 2.newman运行 newman可以理解为,没有…...
Lua 实现继承的一种方式
以下代码来自Loxodon Framework,截取自其中的一段 function class(classname, super)local cls {}cls.__classname classnamecls.__class clscls.base function (self)return cls.superendcls.__type 0cls.super supercls.__index clsif super thensetmetat…...
相机网卡开启巨型帧和关闭节能模式方法
2022 年 8 月 2 日 Tank 阅读次数(ip/1年): 26,796 win10为例子 首先在开始菜单搜索:网络连接 对想要设置的网络右键:属性 点 配置 高级里面找到这三个选项,参考下图设置,螃蟹网卡建议关掉所有节能有关的…...
如何在 Ubuntu 22.04 上安装带有 Nginx 的 ELK Stack
今天我们来聊聊如何在 Ubuntu 22.04 服务器上安装 ELK Stack,并集成 Nginx 作为 Web 服务器,同时使用 Let’s Encrypt Certbot 进行 SSL 认证。ELK Stack,包括 Elasticsearch、Logstash 和 Kibana,是一套强大的工具,用…...