Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于kotlin中的另一个ArrayList对ArrayList进行排序_List_Sorting_Kotlin - Fatal编程技术网

基于kotlin中的另一个ArrayList对ArrayList进行排序

基于kotlin中的另一个ArrayList对ArrayList进行排序,list,sorting,kotlin,List,Sorting,Kotlin,我有一个字符串的列表,如下所示:- val a = listOf("G", "F", "E", "D", "C", "B", "A") 我将从服务器获取另一个列表。例如:- val b = listOf("A", "G", "C") 来自服务器的列表可能包含较少的元素或较多的元素,但不包含第一个列表以外的元素 所以,排序后的输出应该是这样的 //G,C,A 您不是在尝试排序,而是在尝试筛选 fun filterByServer(server: List<String>, loca

我有一个
字符串的列表,如下所示:-

val a = listOf("G", "F", "E", "D", "C", "B", "A")
我将从服务器获取另一个列表。例如:-

val b = listOf("A", "G", "C")
来自服务器的列表可能包含较少的元素或较多的元素,但不包含第一个列表以外的元素

所以,排序后的输出应该是这样的

//G,C,A


您不是在尝试排序,而是在尝试筛选

fun filterByServer(server: List<String>, local: List<String>)
        = local.filter { value -> server.contains(value) }
fun-filterByServer(服务器:列表,本地:列表)
=local.filter{value->server.contains(value)}

filter
在这种情况下,如果您的本地值包含在服务器列表中,则采用谓词

您可以使用
map
sorted
a
没有重复的条件下轻松实现这一点-

val a = listOf("G", "F", "E", "D", "C", "B", "A")
val b = listOf("A", "G", "C")
val there = b.map{ v -> a.indexOf(v)}.sorted().map{v -> a[v]}
println(there)
输出::[G,C,A]

@jsamol在评论中指出的备用分拣机方式-

val there = b.sortedBy { a.indexOf(it) }

您可以根据a列表中的字母索引创建自定义比较器。然后使用List.sortedWith函数对b列表进行排序。 e、 g

val a=listOf(“G”、“F”、“E”、“D”、“C”、“B”、“a”)
val b=列表中的(“A”、“G”、“C”)
val indexedA:Map=a.mapIndexed{index,s->s to index}.toMap()
val比较器=对象:比较器{
覆盖有趣的比较(s1:String,s2:String):Int{
val i1=指数[s1]
val i2=指数[s2]
如果(i1==null | | i2==null)抛出RuntimeException(“无法比较$s1和$s2”),则返回
else i1.与(i2)相比
}
}
val c=b.带(比较器)的分拣
系统输出打印LN(c)

我已经将列表a转换为map:Letter-to-Index作为一种优化。如果我理解这个要求,我们在这里真正做的是根据第一个列表的元素是否在第二个列表中过滤。因此,另一种方法是显式地这样做

val a = listOf("G", "F", "E", "D", "C", "B", "A")
val b = listOf("A", "G", "C").toSet()   // or just setOf(…)
val there = a.filter{ it in b }
在创建集合的过程中需要更多的处理,但是其余的过程更快,扩展性更好,因为不需要排序或扫描,检查集合中是否存在非常快


(事实上,如果
b
是一个列表,那就行了;但对于大列表来说,这就不行了。)

到目前为止你有没有尝试过什么?你只想排序
b
?是的,@The_ehT,需要根据列表对服务器列表(列表b)进行排序aI不认为“排序”是正确的词。您希望通过仅保留从服务器(
b
)获取的目标列表中的元素来过滤源列表(
a
),这是另一种查看方法。如果他想根据
a
处元素的顺序对
b
进行排序怎么办?这里需要
toMutableList()
吗?@LeonardoHerrera你说得对,不是因为筛选方法会返回另一个列表,我的错误是因为我使用数组编写方法,然后意识到它是一个列表,与标题混淆了,谢谢,现在应该更新了,无需映射
b
两次。你可以使用
sortedBy
b.sortedBy{a.indexOf(it)}
哦,是的,这样更好。我完全忘记了按
分类的
。谢谢你指出。我不认为更短的代码更好:排序通常会进行
O(N*logN)
比较,其中N是排序列表中的项目数,对于每个比较,它需要执行两个
a.indexOf(it)
操作,它们本身就是
O(M)
,其中M是第一个列表中的元素数。因此产生的复杂性将是
O(N*logN*2M)
。原始的映射索引方法的复杂度只有
O(N*(M+logN+1))
。对于大型列表,这种差异可能非常显著。为什么不使用
b.sortedBy{indexedA[it]}
?是的,
sortedBy
看起来是更好(更短)的解决方案
val a = listOf("G", "F", "E", "D", "C", "B", "A")
val b = listOf("A", "G", "C").toSet()   // or just setOf(…)
val there = a.filter{ it in b }