调用排序映射后阵列上
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调用排序映射后阵列上相关的知识,希望对你有一定的参考价值。
我想修剪白色空间关闭后,从线路长度stdin
读行进行排序。该代码按预期工作。
import std.algorithm, std.array, std.stdio, std.string;
void main()
stdin
.byLineCopy
.map!(strip)
.array
.sort!((a, b) => a.length < b.length)
.each!writeln;
但是,如果我换map
符合array
线,
void main()
stdin
.byLineCopy
.array
.map!(strip)
.sort!((a, b) => a.length < b.length)
.each!writeln;
该程序无法编译,并出现以下错误,
sort_lines.d(9): Error: template std.algorithm.sorting.sort cannot deduce function from argument types !((a, b) => a.length < b.length)(MapResult!(strip, string[])), candidates are:
/usr/include/dmd/phobos/std/algorithm/sorting.d(1852): std.algorithm.sorting.sort(alias less = "a < b", SwapStrategy ss = SwapStrategy.unstable, Range)(Range r) if ((ss == SwapStrategy.unstable && (hasSwappableElements!Range || hasAssignableElements!Range) || ss != SwapStrategy.unstable && hasAssignableElements!Range) && isRandomAccessRange!Range && hasSlicing!Range && hasLength!Range)
Failed: ["/usr/bin/dmd", "-v", "-o-", "sort_lines.d", "-I."]
我不明白为什么。不映射函数适用于每个元素的范围,并返回一个新的范围是多少?根据文件,sort
要求其范围参数是随机访问的。是什么原因呢?如果是这样,什么是map
返回范围的类型?
答案
map
返回不具有分配的或可切换元素的范围内 - 即sort
指定另一要求。该解决方案是,如在第一个例子中,迭代到一个数组第一。
因为map
不计算,不按裁判返回值的元素是不可转让。因此,即使你没有抢到返回元素的地址,并改写与该位置上的新的价值,它不会改变实际的支持数组中的值。
这个问题实际上比这个稍微差一些。什么[1,2,3].map!(a => a * 2)
确实是需要一个元件[1,2,3],如果我不喜欢的东西[1,2,3].map!(a => a * 2)[0] = 4
,这将有反转功能a => a * 2
找出价值投入[1,2除以2乘以它, 3],并把它变成[2,2,3]。在这相对容易,但如果我试图指派5而不是4个以上的情况下?如果映射功能是什么单向散列?正如我们所看到的,唯一的解决方法就是用map
ped值的商店 - 即[1,2,3].map.array
。
以上是关于调用排序映射后阵列上的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Dart 中仅使用级联或链式调用干净地映射/排序/折叠/排序/扩展?