调用排序映射后阵列上

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个以上的情况下?如果映射功能是什么单向散列?正如我们所看到的,唯一的解决方法就是用mapped值的商店 - 即[1,2,3].map.array

以上是关于调用排序映射后阵列上的主要内容,如果未能解决你的问题,请参考以下文章

在集合返回后调用集合上的映射与使用点链接映射

如何在 Dart 中仅使用级联或链式调用干净地映射/排序/折叠/排序/扩展?

为啥我不能在 Laravel 上正确映射嵌套查询? “在 null 上调用成员函数 map()”显示为错误

在plsql中映射元素然后排序

在映射文件上调用 VirtualProtect

ODI Scenario 场景