误用 Kotlin 中的 sortedWith() 方法排序,集合没有变化

时间:2019年8月4日14:17:06
问题描述:
看下边的小例子:

data class Man(val name: String, val age: Int, val type: Int)

fun main(args: Array<String>) {
val list = mutableListOf<Man>()
list.add(Man("wzc", 31,2))
list.add(Man("wzj", 32,1))
list.add(Man("wcx", 3,1))
list.add(Man("wcg", 7,1))
println("before sort")
for (man in list) {
println(man)
}
list.sortedWith(Comparator {lh, rh ->
if (lh.type.compareTo(rh.type) == 0) {
lh.age.compareTo(rh.age)
} else {
lh.type.compareTo(rh.type)
}
})
println("after sort")
for (man in list) {
println(man)
}
}

/*
打印结果:
before sort
Man(name=wzc, age=31, type=2)
Man(name=wzj, age=32, type=1)
Man(name=wcx, age=3, type=1)
Man(name=wcg, age=7, type=1)
after sort
Man(name=wzc, age=31, type=2)
Man(name=wzj, age=32, type=1)
Man(name=wcx, age=3, type=1)
Man(name=wcg, age=7, type=1)
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
可以看到排序前后,打出的内容没有丝毫变化。
解决方法:
看一下 sortedWith 的代码:

/**
* Returns a list of all elements sorted according to the specified [comparator].
*
* The sort is _stable_. It means that equal elements preserve their order relative to each other after sorting.
*/
public fun <T> Iterable<T>.sortedWith(comparator: Comparator<in T>): List<T> {
if (this is Collection) {
if (size <= 1) return this.toList()
@Suppress("UNCHECKED_CAST")
return (toTypedArray<Any?>() as Array<T>).apply { sortWith(comparator) }.asList()
}
return toMutableList().apply { sortWith(comparator) }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
可以排序后的结果是在返回值里面。
修改代码:

data class Man(val name: String, val age: Int, val type: Int)

fun main(args: Array<String>) {
val list = mutableListOf<Man>()
list.add(Man("wzc", 31,2))
list.add(Man("wzj", 32,1))
list.add(Man("wcx", 3,1))
list.add(Man("wcg", 7,1))
println("before sort")
for (man in list) {
println(man)
}
// list.sortedWith(Comparator {lh, rh ->
// if (lh.type.compareTo(rh.type) == 0) {
// lh.age.compareTo(rh.age)
// } else {
// lh.type.compareTo(rh.type)
// }
// })
// println("after sort")
// for (man in list) {
// println(man)(http://www.my516.com)
// }
val sortedWith = list.sortedWith(Comparator { lh, rh ->
if (lh.type.compareTo(rh.type) == 0) {
lh.age.compareTo(rh.age)
} else {
lh.type.compareTo(rh.type)
}
})
list.clear()
list.addAll(sortedWith)
println("after sort")
for (man in list) {
println(man)
}
}

/*
打印结果:
before sort
Man(name=wzc, age=31, type=2)
Man(name=wzj, age=32, type=1)
Man(name=wcx, age=3, type=1)
Man(name=wcg, age=7, type=1)
after sort
Man(name=wcx, age=3, type=1)
Man(name=wcg, age=7, type=1)
Man(name=wzj, age=32, type=1)
Man(name=wzc, age=31, type=2)
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
可以看到,正常排序了。可以看到还有个 sortWith 方法:

expect fun <T> MutableList<T>.sortWith(comparator: Comparator<in T>): Unit
1
二者的区别是:sortedWith() 方法可以通过 Iterable 对象调用,排序结果在返回值里;而 sortWith() 方法只能通过 MutableList 来调用,排序结果不在返回值里,而是直接在调用对象里了。sortedWith() 方法内部最终还是调用 sortWith() 方法来排序的。

原文地址:https://www.cnblogs.com/ly570/p/11384655.html

时间: 2024-10-12 13:42:38

误用 Kotlin 中的 sortedWith() 方法排序,集合没有变化的相关文章

千万不要误用 java 中的 HashCode 方法

刚才debug追堆栈的时候发现一个很奇怪的问题 我用IE8和Google的浏览器访问同一个地址 Action的 scope="session" 也设置了 而且两个浏览器提交的参数map也是互相独立的 不过很奇怪的一个 两个Action对象的hashmap是不同的但是它们的对象变量 paraterMap 的 哈希值 居然是一个 我大不解!( 找到原因以后发现这个问题其实只是一个好多年没有再提起的基础问题 ) 不过发现确实有朋友在网上说这个问题曾经引发过bug Java中的hashCode

在Kotlin中使用注释处理Android框架 kapt

本教程介绍如何在 Kotlin 中使用依赖于注释处理的流行的 Android 框架和库. 在日常 Android 开发中,流行着数以千计的框架帮助我们提升开发效率. 使用 Kotlin 开发时仍然可以沿用这些框架,而且和使用 Java 同样简单. 本章教程将提供相关示例并重点介绍配置的差异. 教程以 Dagger. Butterknife. Data Binding. Auto-parcel 以及 DBFlow 为例(其它框架配置基本类似). 以上框架均基于注解处理方式工作:通过对代码注解自动生

对list集合中的对象进行排序(转载)

原文链接:http://blog.csdn.net/veryisjava/article/details/51675036 Collections对List集合中的数据进行排序 有时候需要对集合中的元素按照一定的规则进行排序,这就需要用到 Java中提供的对集合进行操作的工具类Collections,其中的sort方法 先看一个简单的例子: public static void main(String[] args) { List<Integer> nums = new ArrayList&l

2018.9.26 如何对List集合中的元素进行排序?

Collections对List集合中的数据进行排序 有时候需要对集合中的元素按照一定的规则进行排序,这就需要用到 Java中提供的对集合进行操作的工具类Collections,其中的sort方法 先看一个简单的例子: [java] view plain copy public static void main(String[] args) { List nums = new ArrayList(); nums.add(3); nums.add(5); nums.add(1); nums.add

对集合中的元素进行排序,接口Comparator&lt;T&gt;和Comparable&lt;T&gt;的使用

关于比较排序比较的接口 或者是类有:java.lang.Comparable<T>接口, 一个抽象类通过实现这个接口可以进行自然排序,也就是一个如果一个自定义类通过implements关键字实现Comparable<T>接口,并且要重写这个接口中的CompareTo()抽象方法,可以再这个方法中定义自己的比较规则:然后再向集合对象中添加元素的时候,就会自动调用compareTo()方法,对集合中的元素进行排序. 对于实现这个接口的类的对象,可以使用Collections类中的静态方

java集合中的retainAll方法

import java.util.ArrayList; public class RetainAllDemo { public static boolean compare(int[] arr1,int[] arr2){ ArrayList<Integer> list1=new ArrayList<>(); ArrayList<Integer> list2=new ArrayList<>(); for(int a:arr1){ list1.add(a); }

java-Collection,List简单使用与方法/(集合使用-中)

1.1集合只存放引用类型的元素并且集合存放的时元素的引用(地址)1.2新循环遍历集合 Collection c = new ArrayList(); c.add("one"); c.add("two"); c.add("three"); c.add("four"); /* * 新循环不是新的语法,jvm并不认可新循环. * 新循环是编译器认可的,当编译器发现在使用新循环遍历集合时,会将代码改变为使用迭代器遍历,所以使用新循环遍

Atitit.现实生活中最好使用的排序方法-----ati排序法总结

1. 现在的问题 1 2. 排序的类别::插入排序//交换排序//选择排序(每次最小/大排在相应的位置  )//归并排序//基数排序 1 3. 选择排序法  (垃圾...不好使用) 2 4. 堆排序-(雅十垃圾...不好用) 2 5. 希尔排序法 (雅十垃圾...不好用) 3 6. 冒泡排序法 (雅十垃圾...不好用) 3 7. 快速排序法 (雅十垃圾...不好用) 3 8. 归并排序法 (雅十垃圾...不好用) 3 9. 插入排序法 ( 勉强能使用,要是加个2分寻找走ok兰..) 3 10. 

JavaScript中数组Array.sort()排序方法详解

JavaScript中数组的sort()方法主要用于对数组的元素进行排序.其中,sort()方法有一个可选参数.但是,此参数必须是函数. 数组在调用sort()方法时,如果没有传参将按字母顺序(字符编码顺序)对数组中的元素进行排序,如果想按照其他标准进行排序,就需要进行传一个参数且为函数,该函数要比较两个值,并且会返回一个用于说明这两个值的相对顺序的数字. 1.对数字数组进行由小到大的顺序进行排序. 代码: var arr = [22,12,3,43,56,47,4]; arr.sort();