scala学习笔记-数组转换(8)

使用yield和函数式编程转换数组

 1 // 对Array进行转换,获取的还是Array
 2 val a = Array(1, 2, 3, 4, 5)
 3 val a2 = for (ele <- a) yield ele * ele
 4 // 对ArrayBuffer进行转换,获取的还是ArrayBuffer
 5 val b = ArrayBuffer[Int]()
 6 b += (1, 2, 3, 4, 5)
 7 val b2 = for (ele <- b) yield ele * ele
 8 // 结合if守卫,仅转换需要的元素
 9 val a3 = for (ele <- if ele % 2 == 0) yield ele * ele
10
11 // 使用函数式编程转换数组(通常使用第一种方式)
12 a.filter(_ % 2 == 0).map(2 * _)
13 a.filter { _ % 2 == 0 } map { 2 * _ }

算法案例:移除第一个负数之后的所有负数

 1 // 构建数组
 2 val a = ArrayBuffer[Int]()
 3 a += (1, 2, 3, 4, 5, -1, -3, -5, -9)
 4
 5 // 每发现一个第一个负数之后的负数,就进行移除,性能较差,多次移动数组
 6 var foundFirstNegative = false
 7 var arrayLength = a.length
 8 var index = 0
 9 while (index < arrayLength) {
10   if (a(index) >= 0) {
11     index += 1
12   } else {
13     if (!foundFirstNegative) { foundFirstNegative = true; index += 1 }
14     else { a.remove(index); arrayLength -= 1 }
15   }
16 } 

算法案例:移除第一个负数之后的所有负数(改良版)

 1 // 重新构建数组
 2 val a = ArrayBuffer[Int]()
 3 a += (1, 2, 3, 4, 5, -1, -3, -5, -9)
 4
 5 // 每记录所有不需要移除的元素的索引,稍后一次性移除所有需要移除的元素
 6 // 性能较高,数组内的元素迁移只要执行一次即可
 7 var foundFirstNegative = false
 8 val keepIndexes = for (i <- 0 until a.length if !foundFirstNegative || a(i) >= 0) yield {
 9   if (a(i) < 0) foundFirstNegative = true
10   i
11 }
12 for (i <- 0 until keepIndexes.length) { a(i) = a(keepIndexes(i)) }
13 a.trimEnd(a.length - keepIndexes.length)
时间: 2024-10-12 11:00:01

scala学习笔记-数组转换(8)的相关文章

Scala学习笔记及与Java不同之处总结-从Java开发者角度

Scala与Java具有很多相似之处,但又有很多不同.这里主要从一个Java开发者的角度,总结在使用Scala的过程中所面临的一些思维转变. 这里仅仅是总结了部分两种语言在开发过程中的不同,以后会陆续更新一些切换后在开发过程中值得注意的地方.以下列举了部分,但令人印象深刻的Scala语言的不同之处,具体的代码演示样例及具体阐述见下文. ? Scala中可直接调用Java代码,与Java无缝连接. 语句能够不用";"结束.且推荐不适用";". 变量声明时以var或va

JS学习笔记-数组

ECMAScript中没有提供类和接口等的定义,但它却是一门面向对象的语言,由于它能够通过其它 方式实现类似高级语言的面向对象功能,这些内容将在后面的文章中进行一步步的总结.此篇仅对JS中对象作简要说明,重点汇总一些类似于对象的数组的经常用法. 对象 创建 上篇提到创建对象的两种方式: 使用new运算符创建Object var obj = new Object(); 使用字面量方式创建 var   obj = {}; 这里值得注意的是在使用字面量(常量)创建Object时不会调用构造函数. 属性

Scala学习笔记及与Java不同之处总结-从Java开发人员角度

Scala与Java具有许多相似之处,但又有许多不同.这里主要从一个Java开发人员的角度,总结在使用Scala的过程中所面临的一些思维转变.这里只是总结了部分两种语言在开发过程中的不同,以后会陆续更新一些切换后在开发过程中值得注意的地方.下面列举了部分,但令人印象深刻的Scala语言的不同之处,具体的代码示例及详细阐述见下文. ? Scala中可直接调用Java代码,与Java无缝连接: 语句可以不用";"结束,且推荐不适用";": 变量声明时以var或val开头

PHP学习笔记-数组(1)

1-1 数组定义 1.什么是数组? 所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标.组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量. 语法如下: <?php //设置某个变量为一个空数组 $arr=array(); ?> 1-2 索引数组初始化 PHP有两种数组:索引数组.关联数组. 索引和关联两个词都是针对数组的键而言的. 索引数组是指数组的键是整数的数组

js学习笔记——数组方法

join() 把数组中所有元素转化为字符串并连接起来,并返回该字符串, var arr=[1,2,3]; var str=arr.join("#"); //str="1#2#3"; 如果没有指定分隔符,则默认为逗号 var str2=arr.join(); //str2="1,2,3"; reverse() 在原数组上把元素的顺序颠倒过来,并返回该数组 var arr=[1,2,3]; arr.reverse(); //arr=[3,2,1];

原创:Scala学习笔记(不断更新)

Scala是一种函数式语言和面向对象语言结合的新语言,本笔记中就零散记下学习scala的一些心得,主要侧重函数式编程方面. 1. 以递归为核心控制结构. 实现循环处理的方式有三种:goto,for/while,递归,其中用goto实现循环已经在现代语言中被放弃,而for/while形式的结构化编程成为主流,而递归作为另一种方案,则长期只流行在函数式编程的小圈子中. 递归被主流编程界所担心的主要是过深的调用栈,甚至以前的课堂上我们还亲自尝试过将递归改写为循环,但是现代函数式编程语言中,通过尾递归(

C++学习笔记33 转换运算符

有时候我们想将一个类类型转换为另一个类类型,同时,这两个类并不存在继承关系,这时候我们就需要一种叫做转换运算符的运算符. 一个简单的例子.要将类A转换为int类型 #include <iostream> #include <string> using namespace std; class A{ private: int n; string str; public: A(int m,string s):n(m),str(s){ } }; int main(){ A a(10,&q

Scala学习笔记一之基础语法,条件控制,循环控制,函数,数组,集合

前言:Scala的安装教程:http://www.cnblogs.com/biehongli/p/8065679.html 1:Scala之基础语法学习笔记: 1:声明val变量:可以使用val来声明变量,用来存放表达式的计算结果,但是常量声明后是无法改变它的值的,建议使用val来声明常量: 声明var变量:如果要声明可以改变的引用,可以使用var变量,声明的常量的值可以改变. 3:指定类型:无论声明val变量还是声明var变量.都可以手动指定其类型,如果不指定,scala会自动根据值,进行类型

scala学习笔记-隐式转换与隐式参数(18)

Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象.通过这些功能,可以实现非常强大,而且特殊的功能. Scala的隐式转换,其实最核心的就是定义隐式转换函数,即implicit conversion function.定义的隐式转换函数,只要在编写的程序内引入,就会被Scala自动使用.Scala会根据隐式转换函数的签名,在程序中使用到隐式转换函数接收的参数类型定义的对象时,会自动将其传入隐式转