Kotlin学习笔记——lambda

参考文献——kotlin之Lambda编程
来自简书作者——程自舟

Kotlin lambda语法

1
2
3
4
5
6
7
8
9
10
11
12
13
btn.setOnClickListener ((View v) -> {
toast("click")
})
btn.setOnclickListener {
toast("click")
}
btn.setOnLongClickListener {
toast("Long Click")
true//lambdda的返回值,不写return
}
{a:Int, b:String -> String
(a + b.toDouble()).toString()
}

完整写法

1
2
3
4
5
6
7
8
9
{a:Int, b:String, c:Long/*输入参数列表*/ -> String/*返回值类型*/
/*lambda body*/
var temp:Double = a + b.toDouble()
if (c == 0L) {
"error"
} else {
(temp.toDouble() + c).toString()
}//返回值(不要写return)
}

省略参数的写法

阅读更多

Kotlin学习笔记——基础语法篇之函数

函数的一般形式

1
2
3
4
5
fun mathodName(/*para list*/) : String/*return value type*/ {
/*
function body
*/
}

与C、C++或java的不同

  1. 如果要重载,在fun前面加override
  2. 如果想让子类重载,要加open关键词(类也一样)
  3. 可以定义全局函数,函数不是必须写在类里
  4. 可以有默认参数,且默认参数不必放在最后几个
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    fun TextView.println(str:CharSequence) {
    append("\n${str}")
    }
    fun TextView.print(str:CharSequence) {
    append(str)
    }//这个东西是扩展函数,后面说
    fun func(str:String = "哈哈哈",i:Int, j:Double) {//str的默认参数"哈哈哈"
    val text:TextView = findViewById(R.id.text)
    text.print("$str")
    text.println("$i")
    text.println("$j")
    }
  • 此时,在调用时,如果第一个不采用默认参数,则按照顺序传递三个参数,否则按照以下形式传递参数
    1
    func(i = 10, j = 20.5)
  1. 可变参数,在参数列表中,参数名称前用vararg(var = varable, arg = 参数)修饰
    1
    2
    3
    4
    5
    6
    7
    fun appendString(tag:String, vararg info:String?) : String {
    var str:String = "${tag}"
    for (item in info) {
    str = "${str}\n${item}"
    }
    return str
    }
阅读更多

Kotlin学习笔记——基础语法篇之控制语句

if…else…

用法

Kotlin中if...else...基本用法与C/C++,java中相同

例子

1
2
3
4
5
6
7
8
button.setOnClickListener {
if (flag) {
text.text = "I love you, at the first sight of you."
} else {
text.text = "I love three things in this world.Sun, moon and you. " +
"Sun for morning, moon for night, and you forever."
}
}

而Kotlin的if else可以有返回值

阅读更多

Kotlin学习笔记——基础语法篇之数据类型

一、基本数据类型

Kotlin的数据类型

数据类型名称 Kotlin的数据类型
整型 Int
长整型 Long
浮点型 Float
双精度浮点型 Double
布尔型 Boolean

声明变量

1
2
3
4
5
6
7
8
9
10
11
var integer:Int//一般用法var/val + 标识符 + : + 类型名,var表示变量
val integer1:Int = 0//val表示常量,相当于java中的final,c++中的const
var str = "this is a string"
//没有":String",此时只要保证编译器可以知道变量的类型,则编译器可以完成类型推断
var flt:Float = 5f//f表示数据为float类型
var tobar:Toolbar? = findViewById<Toolbar>(R.id.toolbar)
/*
类型名后+'?'表示该变量为可空变量,kotlin为了防止java中NullPointerException,
默认所有的变量都是不可空(不能为null的),如果要让变量为空,需要+'?',
此时,编译器会强制程序员对所有可空变量进行非空判断
*/

Kotlin的类型转换

阅读更多

Kotlin学习笔记——基础语法篇之特殊运算符

参考文献——Kotlin学习之运算符
来自简书作者——Hunter_Arley

等值判断

运算符 解释 重载函数
a == b 判断ab是否结构相等,相当于java中a.equals(b)或b.equals(a) a?.equals(b)?:b===null
a != b 判断ab是否结构不等,相当于java中!a.equals(b)或!b.equals(a) !(a?.equals(b)?:b===null)
=== 判断是否结构相等且引用相同
  • ps: Kotlin中的==用来比较两个元素是否相同,比如字符串的内容,整数,浮点数的值,而不比较引用是否相同,而===表示比较内容是否相同,且引用是否相同

新增运算符

运算符 解释 重载函数
is 判断变量是否为某个类型
a in b 检查元素a是否在b中 b.contains(a)
阅读更多

Kotlin学习笔记——基础语法篇之类和对象

类的构造

Kotlin类的写法

  1. Kotlin类的构造函数分为主构造函数和二级构造函数
  2. 主构造函数的特点——函数名为init,参数要写在类名后面(下面举例),一般用于初始化
  3. 如果要在java中调用kotlin的类,要在类名前面加上@JvmOverloads(让java能够识别默认参数),并且补充constructor关键字
  4. 主构造函数的参数写在类名后,如果没有@JvmOverloads修饰,constructor关键字可省略(不是指二级构造函数的constructor,是类名后面的)
  5. 二级构造函数用constructor关键字
  6. 二级构造函数的特点——可有可无,相互独立,如果有主构造函数,先调用主构造函数

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Animal (type:String = "动物", name:String) {
//没有@JvmOverloads修饰,可以省略constructor
//等价以下写法
//class Animal constructor(type:String = "动物", name:String) {
var Type:String = ""
var Name:String = ""
var Age:Int = 0
var Sex:String = ""
init {
Type = type
Name = name
}
constructor(type:String = "动物", name:String, age:Int, sex:String) : this(type, name){
Age = age
Sex = sex
}

}

类的成员

阅读更多

LeetCode-1

1.两数之和

AC代码

思路

  • 刚开始就是用双层for循环写,然后秉承着谦虚的态度看了题解,发现真的有O(N)的算法一遍哈希表。

  • 主要就是利用map建立从数到数组下标的map,然后每次计算出target-nums[i]的值,然后看map里面有对应的下标,有的话就输出,没有就继续。

  • map的值为0时,如何区分stl的map知识有限,如何判断0是数组里面没有这个数还是查询的引索为0呢?只要储存的时候下标+1,用的时候减一就行了,这样map值为0,一定是没有这个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ans;
map<int, int> m;
for (int i = 0; i < nums.size(); i++) {
int pos = target - nums[i];
if (m[pos] != 0 && m[pos] != i + 1) {
pos = m[pos] - 1;
ans.push_back(pos > i ? i : pos);
ans.push_back(pos < i ? i : pos);
break;
}
m[nums[i]] = i + 1;
}
return ans;
}
};

2. 两数相加

阅读更多

LeetCode-2

20. 有效的括号

思路

  1. 创建一个栈
  2. 遍历字符串
    1. 如果是左半部分,把这个字符压栈
    2. 如果是右半部分,先看一下栈顶元素和它是否配对,如果配对,弹栈,不配对,结束,返回false
  3. 字符串遍历结束后,看栈是否已经空了,如果没空,说明左右括号数量不对应false

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
static const auto __ = []() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
return nullptr;
}();
class Solution {
public:
bool isValid(string s) {
int p[128] = {0};
p['('] = ')'; p[')'] = 0;
p['['] = ']'; p[']'] = 0;
p['{'] = '}'; p['}'] = 0;
stack<char> sta;
for (int i = 0; i < s.length(); i++) {
if (p[s[i]]) {
sta.push(s[i]);
} else {
if (sta.empty() || p[sta.top()] != s[i]) return false;
sta.pop();
}
}
return sta.empty();
}
};

26. 删除排序数组中的重复项

阅读更多

LeetCode-3

58. 最后一个单词的长度

AC代码

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
int lengthOfLastWord(string s) {
reverse(s.begin(), s.end());
stringstream ss(s);
string buf;
ss >> buf;
reverse(buf.begin(), buf.end());
return buf.length();
}
};
1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
int lengthOfLastWord(string s) {
int count = 0;
for (int i = s.length() -1 ; i >= 0; i--) {
if (s[i] != ' ')count++;
else if (count > 0) break;
}
return count;
}
};

66. 加一

思路

阅读更多

LeetCode-4

172. 阶乘后的零

思路

把2,5的倍数拆成2,5,数5的个数(2一定比5多),这样5一定和2配对,所以5的个数就是末尾0的个数

AC代码

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
int trailingZeroes(int n) {
int ans = 0;
while (n) {
n /= 5;
ans += n;
}
return ans;
}
};
1
2
3
4
5
6
class Solution {
public:
int trailingZeroes(int n) {
return n == 0 ? 0 : n/5 + trailingZeroes(n / 5);
}
};
阅读更多