当前位置: 首页 > news >正文

scala的集合

scala的集合系统的区分了可变( mutable  )和不可变(immutable )集合。

mkString(seq:String)方法是将原字符串使用特定的字符串seq分割。

mkString(statrt:String,seq:String,end:String)方法是将原字符串使用特定的字符串seq分割的同时,在原字符串之前添加字符串start,在其后添加字符串end。

    var str0 = "scala"println(str0.mkString(",")) //separate string with commaprintln(str0.mkString("begin", ",", "end"))val a = List(1,2,3,4)val b = new StringBuilder()println(a.mkString("List(" , "- " , ")"))

输出格式:

s,c,a,l,a
begins,c,a,l,aendList(1- 2- 3- 4)

备注:集合中的大部分都存在(指名字相同的类分别存在)三个包中:collection、mutable、immutable,只有trait Buffer只存在mutable集合中

不可变数组Array

Java中不同的是,Scala中没有数组这一种类型。在Scala中,Array类的功能就与数组类似。与所有数组一样,Array的长度不可变,里面的数据可以按索引位置访问

备注Array是在scala包下,而不是在scala.collection包下

    //第一种构造:指定泛型,指定长度val array1 = new Array[Int](5)array1(1) = 1 // 实际上调用的是实例对象update方法,等价arr1.update(1,1)println(array1(1))//第二种构造:初始化元素,可以是任意类型,实质是隐式调用apply方法val array2 = Array(0, 1, 2, 3, 4)println(array2(3))//增加元素(由于创建的是不可变数组,增加元素,其实是产生新的数组)val ints: Array[Int] = array1 :+ 5 //元素加在数组最后面 巧记::写在集合的那一侧val newArr3 = 15 +: array2 //元素加在数组最前面val newArr4 = 19 +: 29 +: newArr3 :+ 26 :+ 73    // 19,29,15,0,1,2,3,4,26,73println(newArr4.mkString(","))// 数组的遍历// 第一种方式for (i <- 0 until array1.length) {println(array1(i))}// 第二种方式for (i <- array1.indices) println(array1(i))// 第三种方式for (elem <- array1) println(elem)// 第四种方式array1.foreach(println)// 第五种方式val iter = array1.iteratorwhile (iter.hasNext)println(iter.next())

 update 方法

当对带有括号并包括一到若干参数的对象进行赋值时,编译器将使用对象的 update 方法对括号里的参数和等号右边的对象执行调用

object Third {def main(args: Array[String]): Unit = {val obj = new SomeClassval result = (obj(1, "key1") = "Hello")println(result)}
}class SomeClass {def update(arg1: Int, arg2: String, arg3: String): String = {println("update method called")arg1 + "|" + arg2 + "|" + arg3}
}

执行结果

update method called
1|key1|Hello

在应用 update 时,等号右边的值会作为 update 方法的最后一个参数。因此,我们可以看到,update方法被默认调用,这个也是scala这门语言的便捷之处,往往通过隐式的方法,实际上调用的确实背后真的方法

可变数组ArrayBuffer

ArrayBuffer混入了mutable下Seq的两个子trait:IndexedSeq、Buffer,与Array一样,元素有先后之分,可以重复,可以随机访问,但是插入的效率不高。

    val arr = new mutable.ArrayBuffer[Int]()arr.append(1) //等价于+=,但可添加多个// :+不会在arr1 上添加元素,而是新生成一个ArrayBufferval newArr1 = arr :+ 2println(arr == newArr1) //falseval newArr2 = arr += 3 //元素加在数组最后面println(arr == newArr2) //truenewArr2 += 4println(arr) //ArrayBuff(1, 3, 4),因为是引用类型,所以对于可变集合,不建议添加元素后赋值给一个新变量5 +=: arr //元素5加在数组前面println(arr)  // ArrayBuffer(5, 1, 3, 4)arr.prepend(6) //等价于+=:,但可添加多个println(arr)  // ArrayBuffer(6, 5, 1, 3, 4)arr.insert(1, 13, 59) //在指定的位置开始添加println(arr)    // ArrayBuffer(6, 13, 59, 5, 1, 3, 4)  在索引1的位置添加13 59arr.insertAll(2, newArr1)  // newArr1 ArrayBuffer(1, 2)println(arr)   //  ArrayBuffer(6, 13, 1, 2, 59, 5, 1, 3, 4)arr.prependAll(newArr2)  // newArr2 = arr  在前面添加println(arr)   // ArrayBuffer(6, 13, 1, 2, 59, 5, 1, 3, 4, 6, 13, 1, 2, 59, 5, 1, 3, 4)arr.remove(3, 10) // 删除指定的位置开始后10个元素 删除 [2, 59, 5, 1, 3, 4, 6, 13, 1, 2]println(arr)   // ArrayBuffer(6, 13, 1, 59, 5, 1, 3, 4)arr -= 13 //删除数组中的元素,如果存在则删除,不存在不做操作println(arr)  // ArrayBuffer(6, 1, 59, 5, 1, 3, 4)  删除13val newArr = arr.toArrayval buff = newArr.toBufferarr.foreach(println)   // arr 的遍历// 创建二维数组val array: Array[Array[Int]] = Array.ofDim[Int](2, 3) //两行三列array.foreach(_.foreach(println))

IndexedSeq

这种类型的主要访问方式是通过索引,默认的实现方式为Vector

备注:这里的IndexedSeq是immutable包下的,相关联的还有Array和String

    val x = IndexedSeq(1, 2, 3)println(x.getClass)println(x(0))val y = Range(1, 5)println(y)

执行结果

class scala.collection.immutable.Vector
1
Range 1 until 5

LinearSeq

主要的区别在于其被分为头与尾两部分。其中,头是容器内的第一个元素,尾是除了头元素以外剩余的其他所有元素LinearSeq默认的实现是List,是不可变列表

    val x = collection.immutable.LinearSeq("a", "b", "c")println(x.head)println(x.tail)

执行结果

a
List(b, c)

List

    // 1. 创建一个Listval list1 = List(23, 65, 87)// 2. 访问和遍历元素println(list1(1))//    list1(1) = 12  //immutable包下的List没有update方法,即不能更改列表中的数据list1.foreach(println)// 3. 添加元素val list2 = 10 +: list1val list3 = list1 :+ 23// 写成方法调用就是添加在前面,写成操作符的形式就添加在后面val list4 = list2.::(51) //生成一个新的List,然后会把元素添加到list2开头,等价51 :: list2println(list4)val list5 = Nil.::(13)println(list5)val list7 = 17 :: 28 :: 59 :: 16 :: Nil // 常见创建列表的方法println(list7)// 4. 合并列表val list9 = list5 ::: list7 // 等价于list7.:::(list5)println(list9)val list10 = list5 ++ list7 // 源码可以发现就是调用:::println(list10)

ListBuff

 相比于List,ListBuffer是可变的集合,可以添加,删除元素,属于scala.collection.mutable包下

    // 1. 创建可变列表val list1: ListBuffer[Int] = new ListBuffer[Int]()   // 不推荐val list2 = ListBuffer(12, 53, 75) //scala中推荐使用的构建方法,使用伴生对象的方式// 2. 添加元素list1.append(15, 62)  // 后插println(list1) // ListBuffer(15, 62)list2.prepend(20)   // 前插println(list2) // ListBuffer(20, 12, 53, 75)list1.insert(1, 19, 22)   // 在索引1的位置添加19 22println(list1) // ListBuffer(15, 19, 22, 62)31 +=: 96 +=: list1 += 25 += 11   // 在lst1的前面添加元素31  96 在后面插入元素25 11println(list1) // ListBuffer(31, 96, 15, 19, 22, 62, 25, 11)// 3. 合并listval list3 = list1 ++ list2 // 返回新的对象,list1和list2不变println(list3) // ListBuffer(31, 96, 15, 19, 22, 62, 25, 11,  20, 12, 53, 75)list1 ++= list2 // 在list1后添加list2的元素,list2不变,如果反过来就是list1 ++=: list2println(list1)   // ListBuffer(31, 96, 15, 19, 22, 62, 25, 11, 20, 12, 53, 75)println(list2)  // ListBuffer(20, 12, 53, 75)// 4. 修改元素list2(3) = 30 // 等价于 list2.update(3, 30)// 5. 删除元素list2.remove(2)list2 -= 25

Set

与其他任何一种编程语言一样,Scala中的Set集合类具有如下特点: 

i、不存在有重复的元素。 

ii、集合中的元素是无序的。换句话说,不能以索引的方式访问集合中的元素。 

iii、判断某一个元素是否在Set集合中比Seq类型的集合要快。

不可变的HashSet
    val x = immutable.HashSet[String]("a", "c", "b")//x.add("d")无法使用,因为是不可变集合,没有add方法。没有类似+=这样的操作val y = x + "d" + "f" // 增加新的元素,生成一个新的集合val z = y - "a" // 删除一个元素,生成一个新的集合val a = Set(1, 2, 3)val b = Set(1, 4, 5)val c = a ++ b //合并集合val d = a -- b // a中剔除b中的元素val e = a & b // 与操作,交集val f = a | b // 或操作,并集
可变的HashSet
    val x = new mutable.HashSet[String]()x += "a" // 添加一个新的元素。注意此时没有生成一个新的集合x.add("d") //因为是可变集合,所以有add方法,返回值是boolean类型x ++= Set("b", "c") // 添加一个新的集合,改变的是x,参照listBufferx.foreach(each => println(each))x -= "b" // 删除一个元素,remove返回值也是boolean类型val flag = x.contains("a") // 是否包含元素println(flag)

不可变Map

Map这种数据结构是日常开发中使用非常频繁的一种数据结构。Map作为一个存储键值对的容器(key-value),其中key值必须是唯一的。 默认情况下,可以通过Map直接创建一个不可变的Map容器对象,这时候容器中的内容是不能改变的,在scala中,可以使用java相同的方式即(key,value)来标识键值对

    // 两种创建map的方式val peoples = Map("john" -> 19, "Tracy" -> 18, "Lily" -> 20) //不可变val peopless = Map(("john", 19), ("Tracy", 18), ("Lily", 20))// people.put("lucy",15) 会出错,因为是不可变集合。//遍历方式1for (p <- peoples) {print(p + "  ") // (john,19)  (Tracy,18)  (Lily,20)}//遍历方式2peoples.foreach(x => {val (k, v) = x; print(k + ":" + v + "  ")}) //john:19  Tracy:18  Lily:20//遍历方式3peoples.foreach({ case (k, v) => print(s"key: $k, value: $v  ") })//遍历方式4for (key <- peoples.keys) {println(s"$key ---> ${peoples.get(key)}") //scala中的map.get返回的是一个Optional类型}println(peoples("Lily")) //等价于get

可变的HashMap

    val map = new mutable.HashMap[String, Int]()map.put("john", 19) // 因为是可变集合,所以可以putmap += (("Tracy", 18))  // 增加,等价于putmap -= "john" // removemap.contains("Lily") //falsemap.foreach({ case (k, v) => println(s"key: $k, value: $v  ") })

元组(元素组合)

元组也是可以理解为一个容器,可以存放各种相同或不同类型的数据。说的简单点,就是将多个无关的数据封装为一个整体,称为元组。Map 中的键值对其实就是元组,只不过元组的元素个数为 2,称之为对偶,二元元组

注意:元组中最大只能有 22 个元素。

    // 1. 创建元组val tuple: (String, Int, Char, Boolean) = ("hello", 100, 'a', true)println(tuple)   // (hello,100,a,true)// 2. 访问数据方式一println(tuple._1)println(tuple._2)println(tuple._3)println(tuple._4)// 2. 访问数据方式二println(tuple.productElement(0)) // 等价于_1,下标从零开始。println(tuple.productElement(1)) // 等价于_2,下标从零开始。println(tuple.productElement(2)) // 等价于_3,下标从零开始。println(tuple.productElement(3)) // 等价于_4,下标从零开始。// 3. 遍历元组数据for (elem <- tuple.productIterator)println(elem)// 4. 嵌套元组val mulTuple = (12, 0.3, "hello", (23, "scala"), 29)println(mulTuple._4._2)   // scala// 对偶val map = Map("a" -> 1, "b" -> 2, "c" -> 3)map.foreach(tuple => {println(tuple._1 + "=" + tuple._2)})

队列

Scala 也提供了队列(Queue)的数据结构,队列的特点就是先进先出。进队和出队的方法分别为 enqueue 和 dequeue

    val que = new mutable.Queue[String]()que.enqueue("a", "b", "c")println(que.dequeue())   //aprintln(que.dequeue())   //bprintln(que.dequeue())   //c

集合常用函数

基本属性和常用操作
val list: List[Int] = List(1, 2, 3, 4, 5, 6, 7)//获取集合长度
println(list.length)
//获取集合大小
//有些集合(比如Set)可能没有length方法,在LinearSeq中等同于 lengthval x = collection.immutable.LinearSeq("a", "b", "c")println(x.size)//循环遍历
list.foreach(println)//迭代器
for (elem <- list.iterator) {println(elem)}//生成字符串
println(list.mkString(","))//是否包含
println(list.contains(3))
衍生集合函数
    val list1: List[Int] = List(1, 2, 3, 4, 5, 6, 7)val list2: List[Int] = List(4, 5, 6, 7, 8, 9, 10)//(1)获取集合的头println(list1.head)//(2)获取集合的尾(不是头的就是尾)println(list1.tail)//(3)集合最后一个数据println(list1.last)//(4)集合初始数据(不包含最后一个)println(list1.init)//(5)反转println(list1.reverse)//(6)取前(后)n 个元素println(list1.take(3))println(list1.takeRight(3))//(7)去掉前(后)n 个元素println(list1.drop(3))println(list1.dropRight(3))//(8)并集println(list1.union(list2)) // 等价于:++//(9)交集println(list1.intersect(list2))//(10)差集println(list1.diff(list2))//(11)拉链操作:如果两个集合的元素个数不相等,那么会将同等数量的数据进行拉链,多余的数据省略不用,返回一个List,其组成元素是二元组println(list1.zip(list2))//(12)滑窗list1.sliding(3, 3).foreach(println)  // 返回值类型:Iterator[List[Int]]// sliding的第一个参数定义窗口的长度,第二个参数定义滑动的步长,当窗口长度和步长相等时称为滚动,如果窗口长度小于步长将造成数据丢失
集合计算简单函数
    val list: List[Int] = List(1, 5, -3, 4, 2, -7, 6)val map = Map(("john", 19), ("Tracy", 18), ("Lily", 20))//(1)求和println(list.sum)//(2)求乘积println(list.product)//(3)最大值println(list.max)//以后看到actionBy名字的方法,同时通过某种自定义函数的结果去执行action方法。println(map.maxBy(_._2)) //("Lily", 20)//(4)最小值println(list.min)println(map.minBy(_._2)) //("Tracy", 18)//(5)排序// (5.1)按照元素大小排序println(list.sortBy(x => x))println(list.sorted.reverse) //倒序,list里的reverseprintln(list.sorted(Ordering[Int].reverse)) //倒序,Ordering里的reverse// (5.2)按照元素的绝对值大小排序println(list.sortBy(x => x.abs))// (5.3)按元素大小升序排序println(list.sortWith((x, y) => x < y))// (5.4)按元素大小降序排序println(list.sortWith((x, y) => x > y))

备注:

1)sorted:对一个集合进行自然排序,可以传递隐式的 Ordering

2)sortBy:通过指定的属性进行排序,通过它的类型。可以传递隐式的 Ordering

def sortBy[B](f: A => B)(implicit ord: Ordering[B]): Repr = sorted(ord on f)

3)sortWith:基于函数的排序,通过一个 comparator 函数,实现自定义排序的逻辑。

def sortWith(lt: (A, A) => Boolean): Repr = sorted(Ordering fromLessThan lt)

集合计算高级函数
    val list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)val nestedList: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))val wordList: List[String] = List("hello world", "hello spark", "hello scala")//(1)过滤println(list.filter(x => x % 2 == 0)) // list.filter(_ % 2 == 0)//(2)转化/映射println(list.map(x => x + 1)) // list.map(_ + 1)//(3)扁平化  将嵌套list 展开成一个listprintln(nestedList.flatten) //List(1, 2, 3, 4, 5, 6, 7, 8, 9)//(4)扁平化+映射 注:flatMap 相当于先进行 map 操作,在进行 flatten操作,集合中的每个元素的子元素映射到某个函数并返回新集合println(wordList.flatMap(x => x.split(" "))) // List(hello, world, hello, spark, hello, scala)//(5)分组:按照指定的规则对集合的元素进行分组println(list.groupBy(x => x % 2)) //Map(1 -> List(1, 3, 5, 7, 9), 0 -> List(2, 4, 6, 8))// Map(奇数 -> List(1, 3, 5, 7, 9), 偶数 -> List(2, 4, 6, 8))println(list.groupBy(data => if (data % 2 == 0) "偶数" else "奇数"))//(6)Reduce 简化(归约) :通过指定的逻辑将集合中的数据进行聚合,从而减少数据,最终获取结果。// 将数据两两结合,实现运算规则val ii: Int = list.reduce((x, y) => x - y) //list.reduce(_ - _ )println("ii = " + ii)// 从源码的角度,reduce 底层调用的其实就是 reduceLeft// 1-2=-1  -1-3=-4 -4-4=-8.....val i1 = list.reduceLeft((x, y) => x - y)println(i1)// 9-8=1 1-7=-6 -6-6=-12....val i2 = list.reduceRight((x, y) => x - y)println(i2)//(7)Fold 折叠:化简的一种特殊情况。// fold 方法使用了函数柯里化,存在两个参数列表,第一个参数列表为 : 零值(初始值),第二个参数列表为: 简化规则。fold 底层其实为 foldLeftval i = list.foldLeft(1)((x, y) => x - y)val i3 = list.foldRight(10)((x, y) => x - y)// 两个 Map 的数据合并val map1 = mutable.Map("a" -> 1, "b" -> 2, "c" -> 3)val map2 = mutable.Map("a" -> 4, "b" -> 5, "d" -> 6)val map3: mutable.Map[String, Int] = map2.foldLeft(map1) {(map, kv) => {val k = kv._1val v = kv._2map(k) = map.getOrElse(k, 0) + vmap}}println(map3) // Map(b -> 7, d -> 6, a -> 5, c -> 3)

相关文章:

scala的集合

scala的集合系统的区分了可变&#xff08; mutable &#xff09;和不可变&#xff08;immutable &#xff09;集合。 mkString(seq:String)&#xff1a;方法是将原字符串使用特定的字符串seq分割。 mkString(statrt:String,seq:String,end:String)&#xff1a;方法是将原字符…...

Flink状态管理深度探索:从Keyed State到分布式快照

Flink状态管理深度探索:从Keyed State到分布式快照 在大数据实时计算领域,Apache Flink凭借其精准的状态管理能力成为行业标杆。本文将从状态管理的核心机制出发,结合金融行业PB级数据处理实践,深入解析状态后端、容错机制与大规模优化策略。 一、Flink状态管理核心架构 …...

Android 11 DAC和MAC

在 Android 11 中,DAC(Discretionary Access Control,自主访问控制) 和 MAC(Mandatory Access Control,强制访问控制) 是两种不同的访问控制机制,主要用于 权限管理、安全性 以及 进程间访问控制。 1. DAC(自主访问控制) DAC(Discretionary Access Control,自主访…...

平衡二叉树(AVL树)

平衡二叉树是啥我就不多说了&#xff0c;本篇博客只讲原理与方法。 首先引入平衡因子的概念。平衡因子&#xff08;Balance Factor&#xff09;&#xff0c;以下简称bf。 bf 右子树深度 - 左子树深度。平衡结点的平衡因子可为&#xff1a;-1&#xff0c;0&#xff0c;1。除此…...

SSM架构 +java后台 实现rtsp流转hls流,在前端html上实现视频播放

序言&#xff1a;书接上文&#xff0c;我们继续 SSM架构 NginxFFmpeg实现rtsp流转hls流&#xff0c;在前端html上实现视频播放 步骤一&#xff1a;把rtsp流转化为hls流&#xff0c;用Java代码进行转换 package com.tools;import java.io.BufferedReader; import java.io.IOExc…...

贪心算法--

1.柠檬水找零 link:860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; code class Solution { public:bool lemonadeChange(vector<int>& bills) {// 贪心算法&#xff0c; 优先花出大面额bill&#xff0c; 尽可能保护小面额billint five 0, ten 0;// 不…...

【从0到1搞懂大模型】神经网络的实现:数据策略、模型调优与评估体系(3)

一、数据集的划分 &#xff08;1&#xff09;按一定比例划分为训练集和测试集 我们通常取8-2、7-3、6-4、5-5比例切分&#xff0c;直接将数据随机划分为训练集和测试集&#xff0c;然后使用训练集来生成模型&#xff0c;再用测试集来测试模型的正确率和误差&#xff0c;以验证…...

CTF工具集合-持续更新

工具地址https://github.com/huan-cdm/ctf_tools工具介绍&#xff1a; 1.ARCHPR&#xff1a;压缩包密码破解工具 2.StegSolve-1.4.jar&#xff1a;隐写图片查看工具 3.ctf_decrypt_tool.rar&#xff1a;随波逐流CTF编码工具 4.010_Editor_All_Versions_For_Windows_CracKed.…...

小方摄像头接入本地服务器的方法

最早众筹时买了几个小方摄像头&#xff0c;后来嫌弃分辨率&#xff0c;就淘汰吃灰好几年&#xff0c;最近想折腾个摄像头识别的小项目&#xff0c;秉着不投入先凑合跑起来的原则&#xff0c;想到了尘封已久的小方&#xff0c;想看看能不能通过网络拉取数据流。 搜索了下&#x…...

取反符号~

取反符号 ~ 用于对整数进行按位取反操作。它会将二进制表示中的每一位取反&#xff0c;即 0 变 1&#xff0c;1 变 0。 示例 a 5 # 二进制表示为 0000 0101 b ~a # 按位取反&#xff0c;结果为 1111 1010&#xff08;补码表示&#xff09; print(b) # 输出 -6解释 5 的二…...

Jenkins实现自动化构建与部署:上手攻略

一、持续集成与Jenkins核心价值 1.1 为什么需要自动化构建&#xff1f; 在现代化软件开发中&#xff0c;团队每日面临以下挑战&#xff1a; 高频代码提交&#xff1a;平均每个开发者每天提交5-10次代码。多环境部署&#xff1a;开发、测试、预发布、生产环境需频繁同步。复杂…...

爱普生温补晶振 TG5032CFN高精度稳定时钟的典范

在科技日新月异的当下&#xff0c;众多领域对时钟信号的稳定性与精准度提出了极为严苛的要求。爱普生温补晶振TG5032CFN是一款高稳定性温度补偿晶体振荡器&#xff08;TCXO&#xff09;。该器件通过内置温度补偿电路&#xff0c;有效抑制环境温度变化对频率稳定性的影响&#x…...

【Java 面试 八股文】计算机网络篇

操作系统篇 1. 什么是HTTP? HTTP 和 HTTPS 的区别?2. 为什么说HTTPS比HTTP安全? HTTPS是如何保证安全的&#xff1f;3. 如何理解UDP 和 TCP? 区别? 应用场景?3.1 TCP 和 UDP 的特点3.2 适用场景 4. 如何理解TCP/IP协议?5. DNS协议 是什么&#xff1f;说说DNS 完整的查询…...

OpenHarmony5.0分布式系统源码实现分析—软总线

一、引言 OpenHarmony 作为一款面向万物互联的操作系统&#xff0c;其分布式软总线&#xff08;Distributed SoftBus&#xff09;是实现设备间高效通信和协同的核心技术之一。分布式软总线通过构建一个虚拟的总线网络&#xff0c;使得不同设备能够无缝连接、通信和协同工作。本…...

Spring Boot/Spring Cloud 整合 ELK(Elasticsearch、Logstash、Kibana)详细避坑指南

我们在开发中经常会写日志&#xff0c;所以需要有个日志可视化界面管理&#xff0c;使用ELK可以实现高效集中化的日志管理与分析&#xff0c;提升性能稳定性&#xff0c;满足安全合规要求&#xff0c;支持开发运维工作。 下述是我在搭建ELK时遇到的许许多多的坑&#xff0c;希望…...

云原生周刊:Istio 1.25.0 正式发布

开源项目推荐 Dstack Dstack 是一个开源的 AI 计算管理平台&#xff0c;旨在简化 AI 任务的部署和管理。它支持本地和云端运行 AI 工作负载&#xff0c;并提供自动化的 GPU 资源调度&#xff0c;使开发者能够更高效地利用计算资源。Dstack 兼容 K8s&#xff0c;可以无缝集成到…...

微前端如何拯救大型项目

前言 在前端开发的世界中&#xff0c;我们经常会遇到这样的问题&#xff1a;一个大型项目往往由多个团队共同开发&#xff0c;每个团队负责一部分功能。然而&#xff0c;随着项目的不断扩大和复杂化&#xff0c;前端代码库变得越来越庞大和难以维护。这时&#xff0c;微前端&a…...

RabbitMQ 高级特性:从 TTL 到消息分发的全面解析 (下)

RabbitMQ高级特性 RabbitMQ 高级特性解析&#xff1a;RabbitMQ 消息可靠性保障 &#xff08;上&#xff09;-CSDN博客 RabbitMQ 高级特性&#xff1a;从 TTL 到消息分发的全面解析 &#xff08;下&#xff09;-CSDN博客 引言 RabbitMQ 作为一款强大的消息队列中间件&#xff…...

OpenManus-通过源码方式本地运行OpenManus,含踩坑及处理方案

前言&#xff1a;最近 Manus 火得一塌糊涂啊&#xff0c;OpenManus 也一夜之间爆火&#xff0c;那么作为程序员应该来尝尝鲜 1、前期准备 FastGithub&#xff1a;如果有科学上网且能正常访问 github 则不需要下载此软件&#xff0c;此软件是提供国内直接访问 githubGit&#…...

Ubuntu22.04修改root用户并安装cuda

由于本人工作原因&#xff0c;经常会遇到需要给ubuntu打显卡驱动的问题&#xff0c;虽然说不难吧&#xff0c;但是耐不住机器多&#xff0c;重复多次也就烦了&#xff0c;于是抽出了一点时间&#xff0c;并且在deepseek的帮助之下&#xff0c;写了一个自动安装驱动的脚本&#…...

Java LeetCode 热题 100 回顾38

干货分享&#xff0c;感谢您的阅读&#xff01;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两…...

MySQL复习笔记

文章目录 1.MySQL1.1什么是数据库1.2 数据库分类1.3 MySQL简介1.4连接数据库 2. 操作数据库2.1 操作数据库2.2 数据库的列类型2.3 数据库的字段属性&#xff08;重点&#xff09;2.4 创建数据库表&#xff08;重点&#xff09;2.5 数据表的类型2.6 修改数据表 3. MySQL 数据管理…...

解释 TypeScript 中的类型系统,如何定义和使用类型?

1. 类型系统的核心作用 TypeScript类型系统本质上是JavaScript的静态类型增强方案&#xff0c;提供三个核心价值&#xff1a; 开发阶段类型检查&#xff08;类似编译时eslint&#xff09;更清晰的API文档&#xff08;类型即文档&#xff09;更好的IDE自动补全支持 代码示例&…...

安裝do時出現log file support is not available

“log file support is not available (press RETURN)” 这个提示信息表明日志文件支持不可用&#xff0c;让你按回车键继续。出现这种情况可能是因为 Odoo 的日志相关配置存在问题或者一些必要的依赖没有正确安装配置。以下是一些可以尝试的解决办法&#xff1a; 1. 检查 Odo…...

[HTTP协议]应用层协议HTTP从入门到深刻理解并落地部署自己的云服务(1)知识基础

[HTTP协议]应用层协议HTTP从入门到深刻理解并落地部署自己的云服务(1)知识基础 水墨不写bug 文章目录 (一)概念梳理1.什么是协议?2.什么是应用层?3. 为什么要进行分层&#xff1f; &#xff08;二&#xff09;HTTP协议2.1 初识HTTP协议2.2HTTP协议的URL2.2.1域名2.2.2端口号2…...

机票改签请求

示例代码&#xff1a; tool def update_ticket_to_new_flight(ticket_no: str, new_flight_id: int) -> str:"""Update the users ticket to a new valid flight.Args:ticket_no (str): The ticket number to be updated.new_flight_id (int): The ID of th…...

linux下文件读写操作

Linux下&#xff0c;文件I/O是操作系统与文件系统之间进行数据传输的关键部分。文件I/O操作允许程序读取和写入文件&#xff0c;管理文件的打开、关闭、创建和删除等操作。 1. 文件描述符 在Linux中&#xff0c;每个打开的文件都由一个文件描述符来表示。文件描述符是一个非负…...

命名管道的创建和通信实现

目录 命名管道的创建 使用函数创建命名管道的通信 预备创建 makefile设计 server.hpp设计 clent.hpp设计 comm.hpp设计 server.cc设计 clent.cc设计 测试运行 今天我们来学习命名管道 由于匿名管道&#xff08;pipe()&#xff09;无法在两个毫不相干的进程之间进行通…...

C++和OpenGL实现3D游戏编程【连载24】——父物体和子物体之间的坐标转换

欢迎来到zhooyu的C++和OpenGL游戏专栏,专栏连载的所有精彩内容目录详见下边链接: 🔥C++和OpenGL实现3D游戏编程【总览】 父子物体的坐标转换 1、本节要实现的内容 前面章节我们了解了父物体与子物体的结构,它不仅能够表示物体之间的层次关系,更重要的一个作用就是展示物…...

21.HarmonyOS Next CustomSlider组件步长控制教程(三)

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 文章目录 1. 步长控制概述2. 步长基本概念2.1 什么是步长&#xff1f;2.2 步长的作用 3. 设置步长3.1 基本参数3.2 代码示例 4. 步长与范围的关系4…...

小白学习:rag向量数据库

学习视频&#xff1a; https://www.bilibili.com/video/BV11zf6YyEnT/?spm_id_from333.337.search-card.all.click 例子&#xff1a; 用户提出问题 客服机器人基于rag回答用户问题 过程拆解&#xff1a; 客户问题 – 转化为向量表示 – 在向量数据库中进行相似性搜索 – 系…...

STM32 CAN模块原理与应用详解

目录 概述 一、CAN模块核心原理 1. CAN协议基础 2. STM32 CAN控制器结构 3. 波特率配置 二、CAN模块配置步骤&#xff08;基于HAL库&#xff09; 1. 初始化CAN外设 2. 配置过滤器 3. 启动CAN通信 三、数据收发实现 1. 发送数据帧 2. 接收数据帧&#xff08;中断方式…...

NO.29十六届蓝桥杯备战|string九道练习|reverse|翻转|回文(C++)

P5015 [NOIP 2018 普及组] 标题统计 - 洛谷 #include <bits/stdc.h> using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);string s;getline(cin, s);int sz s.size();int cnt 0;for (int i 0; i < sz; i){if (isspace(s[i]))continue…...

最新版本TOMCAT+IntelliJ IDEA+MAVEN项目创建(JAVAWEB)

前期所需&#xff1a; 1.apache-tomcat-10.1.18-windows-x64&#xff08;tomcat 10.1.8版本或者差不多新的版本都可以&#xff09; 2.IntelliJ idea 24年版本 或更高版本 3.已经配置好MAVEN了&#xff08;一定先配置MAVEN再搞TOMCAT会事半功倍很多&#xff09; 如果有没配置…...

MAC-禁止百度网盘自动升级更新

通过终端禁用更新服务(推荐)​ 此方法直接移除百度网盘的自动更新组件,无需修改系统文件。 ​步骤: ​1.关闭百度网盘后台进程 按下 Command + Space → 输入「活动监视器」→ 搜索 BaiduNetdisk 或 UpdateAgent → 结束相关进程。 ​2.删除自动更新配置文件 打开终端…...

Unity DOTS从入门到精通之EntityCommandBufferSystem

文章目录 前言安装 DOTS 包ECBECB可以执行的指令示例&#xff1a; 前言 DOTS&#xff08;面向数据的技术堆栈&#xff09;是一套由 Unity 提供支持的技术&#xff0c;用于提供高性能游戏开发解决方案&#xff0c;特别适合需要处理大量数据的游戏&#xff0c;例如大型开放世界游…...

【AIGC系列】6:HunyuanVideo视频生成模型部署和代码分析

AIGC系列博文&#xff1a; 【AIGC系列】1&#xff1a;自编码器&#xff08;AutoEncoder, AE&#xff09; 【AIGC系列】2&#xff1a;DALLE 2模型介绍&#xff08;内含扩散模型介绍&#xff09; 【AIGC系列】3&#xff1a;Stable Diffusion模型原理介绍 【AIGC系列】4&#xff1…...

【Linux】使用问题汇总

#1 ssh连接的时候报Key exchange failed 原因&#xff1a;服务端版本高&#xff0c;抛弃了一些不安全的交换密钥算法&#xff0c;且客户端版本比较旧&#xff0c;不支持安全性较高的密钥交换算法。 解决方案&#xff1a; 如果是内网应用&#xff0c;安全要求不这么高&#xf…...

nnUNet V2修改网络——全配置替换MultiResBlock模块

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 MultiRes Block 是 MultiResUNet 中核心组件之一,旨在解决传统 U-Net 在处理多尺度医学图像时的局…...

Git合并工具在开发中的使用指南

在团队协作开发中&#xff0c;Git 是最常用的版本控制工具&#xff0c;而代码合并&#xff08;Merge&#xff09;是多人协作不可避免的环节。当多个开发者同时修改同一文件的相同区域时&#xff0c;Git 无法自动完成合并&#xff0c;此时需要借助合并工具&#xff08;Merge Too…...

AutoDL平台租借GPU,创建transformers环境,使用VSCode SSH登录

AutoDL平台租借GPU&#xff0c;创建transformers环境&#xff0c;使用VSCode SSH登录 一、AutoDl平台租用GPU 1.注册并登录AutoDl官网&#xff1a;https://www.autodl.com/home 2.选择算力市场&#xff0c;找到需要的GPU&#xff1a; 我这里选择3090显卡 3.这里我们就选择P…...

listen EACCES: permission denied 0.0.0.0:811

具体错误 npm run serve> bige-v0.0.0 serve > viteThe CJS build of Vites Node API is deprecated. See https://vitejs.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated for more details. error when starting dev server: Error: listen EACCES: per…...

OpenAI API模型ChatGPT各模型功能对比,o1、o1Pro、GPT-4o、GPT-4.5调用次数限制附ChatGPT订阅教程

本文包含OpenAI API模型对比页面以及ChatGPT各模型功能对比表 - 截至2025最新整理数据&#xff1a;包含模型分类及描述&#xff1b;调用次数限制&#xff1b; 包含模型的类型有&#xff1a; Chat 模型&#xff08;如 GPT-4o、GPT-4.5、GPT-4&#xff09;专注于对话&#xff0c…...

六十天前端强化训练之第十五天React组件基础案例:创建函数式组件展示用户信息(第15-21天:前端框架(React))

欢迎来到编程星辰海的博客讲解 我们已经学了14天了&#xff0c;再坚持坚持&#xff0c;马上我们就可以变得更优秀了&#xff0c;加油&#xff0c;我相信大家&#xff0c;接下来的几天&#xff0c;我会给大家更新前端框架&#xff08;React&#xff09;&#xff0c;看完可以给一…...

北大一二三四版全套DeepSeek教学资料

DeepSeek学习资料合集&#xff1a;https://pan.quark.cn/s/bb6ebf0e9b4d DeepSeek实操变现指南&#xff1a;https://pan.quark.cn/s/76328991eaa2 你是否渴望深入探索人工智能的前沿领域&#xff1f;是否在寻找一份能引领你从理论到实践&#xff0c;全面掌握AI核心技术的学习…...

计算机网络:计算机网络的组成和功能

计算机网络的组成&#xff1a; 计算机网络的工作方式&#xff1a; 计算机网络的逻辑功能; 总结&#xff1a; 计算机网络的功能&#xff1a; 1.数据通信 2.资源共享 3.分布式处理:计算机网络的分布式处理是指将计算任务分散到网络中的多个节点&#xff08;计算机或设备&…...

管理网络安全

防火墙在 Linux 系统安全中有哪些重要的作用&#xff1f; 防火墙作为网络安全的第一道防线&#xff0c;能够根据预设的规则&#xff0c;对进出系统的网络流量进行严格筛选。它可以阻止未经授权的外部访问&#xff0c;只允许符合规则的流量进入系统&#xff0c;从而保护系统免受…...

音频进阶学习十九——逆系统(简单进行回声消除)

文章目录 前言一、可逆系统1.定义2.解卷积3.逆系统恢复原始信号过程4.逆系统与原系统的零极点关系 二、使用逆系统去除回声获取原信号的频谱原系统和逆系统幅频响应和相频响应使用逆系统恢复原始信号整体代码如下 总结 前言 在上一篇音频进阶学习十八——幅频响应相同系统、全…...

Redis7系列:设置开机自启

前面的文章讲了Redis和Redis Stack的安装&#xff0c;随着服务器的重启&#xff0c;导致Redis 客户端无法连接。原来的是Redis没有配置开机自启。此文记录一下如何配置开机自启。 1、修改配置文件 前面的Redis和Redis Stack的安装的文章中已经讲了redis.config的配置&#xf…...

word甲烷一键下标

Sub 甲烷下标()甲烷下标 宏Selection.Find.ClearFormattingSelection.Find.Replacement.ClearFormattingWith Selection.Find.Text "CH4".Replacement.Text "CHguoshao4".Forward True.Wrap wdFindContinue.Format False.MatchCase False.MatchWhole…...