一、循环语句
for循环
//循环遍历字符串,不包含选定字符
fun main(args: Array<String>) {
val ar = "abcde"
for(c in ar)
{
if(c.equals('c'))
continue
print(c )
}
}
for循环带索引
fun main(args: Array<String>) {
val ar = "abcde"
for ((index, c) in ar.withIndex()) {
println("index=$index,c=$c")
}
forEach循环
fun main(args: Array<String>) {
val ar = "abcde"
ar.forEach {
println(it)
}
}
forEach循环带索引
fun main(args: Array<String>) {
val ar = "abcde"
ar.forEachIndexed { index, c -> print("index=$index c=$index .") }
注意:
1.for循环可以使用continue和break关键字,forEach循环不可以
2.用来表示变量的值,index表示index变量的值
标签处返回@
fun main(args: Array<String>) {
val str1 = "123"
val str2 = "abc"
h@ for (c2 in str1) {
for (c1 in str2) {
print("$c1$c2 ")
if (c1 == 'b' && c2 == '2')
break@h
}
}
}
//此处用于以break结束外层for循环
while循环
fun main(args: Array<String>) {
var i = 1
var count = 0
while(i<=100)
{ count += i
i++ }
println(i )
println(count)
}
//此处注意变量使用.变量修饰符为可变变量var
二、区间
fun main(args: Array<String>) {
val arr = IntRange(0, 100)
val arr1 = 1.rangeTo(100)
val arr2 = 1..100
//区间的三种定义方式(均包含头尾)
val arr3 = 'a'.rangeTo('s')
val arr4 = CharRange('b','y')
val arr5 = 'A'..'z'
val arr6 = LongRange(1,100)
val arr7 = 2L.rangeTo(100)
val arr8 = 1L..100}
//1.区间有IntRange,CharRange,LongRange三种
//2.LongRange书写时后两种方式前面的L不能省略,生成固定代码后可以省略.小写的l会报错
区间遍历
1.加上步长遍历
fun main(args: Array<String>) {
val arr = IntRange(0, 100)
val arr1 = 1..100
for (i in arr.step(2)) { //arr.step(2)输出偶数,arr1.step(2)输出奇数
print(" "+i)
} }
2.for循环加上index
for ( (index,c) in arr1.withIndex()) {
println("$index,$c")
}
//输出结果为 0,1
2.1
for (c in arr.withIndex()) {
println(c)
}
//默认写法输出值IndexedValue(index=0, value=0)
3.forEach遍历
arr.forEach { println(" "+it) } //it为固定名称变量,不可修改
4.forEach带索引遍历
arr5.forEachIndexed { index, c ->
println("$index,$c")
}
反向区间 downTo
val ar = 25 downTo 1
println(ar) //结果为 25 downTo 1 step 1
区间的反转 reversed
val al = ar.reversed()
数组
1.定义
1.1 已知元素
val arr = arrayOf("张三","李四","王五")
val arr5 = arrayOf("李", 4, '3') //Any型数组
val arr3 = intArrayOf(3,4,4) //定义整型数组
注: arrayOf不带类型,数组可以是任意类型
1.2 只知道元素个数
val arr2 = IntArray(3)
//定义一个长度(元素个数)为3的字符数组,初始值为1
val arr1 = Array<String>(3){"1"}
val arry = Array<Char>(4) { 'a' }
注:String字符串数组创建含Any型只有2种
2.访问与修改
val arr5 = arrayOf("李", 4, '3')
println(arr5[2]) /输出为 3
val arr2 = IntArray(3)
arr2.set(1,2)
println(arr2[1]) /2
println(arr2[0]) /0
3.查找数组索引/角标
val arr5 = arrayOf("李一","李四","李三","李四","王")
println(arr5.lastIndexOf("李四"))
println(arr5.indexOfLast { it == "李四" })
//前两个结果都为3
println(arr5.indexOfFirst { it == "李四"}) //1
println(arr5.indexOf("王")) //默认输出第一个索引 val index3 = arr5.indexOfFirst {
it.startsWith("李")
}
println(index3) //0
println(arr5.indexOfLast { it.startsWith("李") }) //3
注:
startsWith只可用于String数组
when表达式
fun Grade(score: Int): String {
when(score){
100 ->return "满分"
in 90..99 -> return "优秀"
in 80.rangeTo(89) ->return "良好"
in 70.rangeTo(79) ->return "及格"
in IntRange(60,69) -> return "较好"
else->return "不及格"
}
}
简写格式
fun Grade(score: Int): String =
when(score){
100 -> "满分"
in 90..99 -> "优秀"
in 80.rangeTo(89) -> "良好"
in 70.rangeTo(79) -> "及格"
in IntRange(60,69) -> "较好"
else-> "不及格"
}
函数表达式
fun main(args: Array<String>) {
println(Grade(83)) //上面的调用
fun max(a:Int,b:Int) = if(a>b) a else b
println(max(-3, 5))
}
另一种写法
fun max(a:Int,b:Int):Int{
return if(a>b) a
else b
}
函数变量
invoke可以非空判断
val minus:(Int,Int)->Int= {a,b->a-b}
println(minus(3, 5))
println(minus.invoke(9, 3))
函数引用::
val app=::Grade
默认参数/具名参数
fun SendRequest(method:String="GET",path:String){
println("$method,$path")
}
fun main(args: Array<String>) {
SendRequest("POST","www.baidu.com") //POST,www.baidu.com
SendRequest(path ="www.google.com") //GET,www.google.com SendRequest("GET","www.cn.com") //GET,www.cn.com
}
可变参数vararg
fun minus(vararg a:Int):Int {
var count = 0
for (i in a) {
count += i
}
return count
}
尾递归tailrec
尾调用的重要性在于它可以不在调用栈上面添加一个新的堆栈帧——而是更新它,如同迭代一般。
尾递归因而具有两个特征: 调用自身函数(Self-called); 计算仅占用常量栈空间(Stack Space)。
//1.计算高斯数
tailrec fun ad(n:Int,result:Int=0):Int{
if(n==1) return result+1
else return ad(n-1,result+n)
}
//2.计算斐波那契数列
2.1
tailrec fun fbnq(n:Int, a:Int,re: Int):Int{
if(n<=1) return a
else return fbnq(n-1,re,a+re)
}
fun main(args: Array<String>) {
println(ad(100))
println(fbnq(10,1,1)) }
2.2
fun main(args: Array<String>) {
tailrec fun f(n:Int, pf:Int=1,ps: Int=1):Int{
if(n<=1) return pf
else return f(n-1,ps,pf+ps)
}
println(f(10))
}
java的尾递归计算斐波那契数列
public class Fa {
public static void main(String[] args) {
System.out.println(Fibonacci(8, 1, 1));
}
public static int Fibonacci(int n,int pf,int ps){
if(n<=1) return pf;
else return Fibonacci(n-1,ps,pf+ps);
}
}
java的循环计算斐波那契数列
public class Fa {
public static void main(String[] args) {
System.out.println(fi(8)); }
public static int fi(int n){
int s1 = 0;
int s2 = 1;
int i1 = 0;
for (int i = 2; i <= n; i++) {
i1 = s2 + s1;
s1 = s2;
s2 = i1;
}return i1;
}
}