如何处理Zip算法的不匹配列表

Mas*_*ler 2 delphi algorithm functional-programming

我正在考虑编写功能Zip例程的Delphi实现,该例程采用两个列表并输出一对元素列表.所以,喂它[1,2,3]和['a','b','c']会给[(1,'a'),(2,'b'),(3,'c') )] 作为结果.如果两个输入的长度完全相同,那就好了,就像我在网上看到的这个函数的每个演示一样.但如果第一个是[1,2,3,4]呢?输出应该是什么?如何在其他语言的其他实现中处理此案例?

Jul*_*iet 10

没有"正确"或"错误"的方法来执行此操作,实现细节由您决定.您可以采取以下几种方法:

1)F#方法:抛出异常.

2)Haskell和Python方法:将输出截断为输入的最小长度.

zip [1; 2; 3] ['a'; 'b'; 'c'; 'd'; 'e']
  = [ (1, 'a'); (2, 'b'); (3, 'c')]
Run Code Online (Sandbox Code Playgroud)

截断有时候很有用,就像你压缩有限和无限序列时的情况一样.

3)Ruby方法:零或零输出不可用值:

zip [1; 2; 3] ['a'; 'b'; 'c'; 'd'; 'e']
  = [ (1, 'a'); (2, 'b'); (3, 'c'); (nil, 'd'); (nil, 'e')]
Run Code Online (Sandbox Code Playgroud)

4)根据需要缩短元组2和1元组:

zip [1; 2; 3] ['a'; 'b'; 'c'; 'd'; 'e']
  = [ (1, 'a'); (2, 'b'); (3, 'c'); ('d'); ('e')]
Run Code Online (Sandbox Code Playgroud)

我不知道这样做的任何语言.

  • 因此,没有"错误"方法的原因;)在我看来,你可以通过消除过程缩小最佳实现:抛出异常似乎是可以接受的.当您使用容易使自己适合无限列表的语言时,默认截断列表是合适的,这似乎排除了Delphi.当你的语言不处理像int和bool这样的原语不同于任何其他对象类型时,替换空值似乎是合适的,这会再次排除Delphi.最好在默认情况下抛出异常. (2认同)