【发布时间】:2015-10-13 10:10:32
【问题描述】:
在给定的Array 中删除索引i 处的项目的最优雅方法是什么?在给定的List?
【问题讨论】:
在给定的Array 中删除索引i 处的项目的最优雅方法是什么?在给定的List?
【问题讨论】:
我能想到的最好的:
removeFromList i xs =
(List.take i xs) ++ (List.drop (i+1) xs)
removeFromArray i =
Array.toList >> removeFromList i >> Array.fromList
【讨论】:
这应该很有效:
remove : Int -> Array a -> Array a
remove i a =
let
a1 = Array.slice 0 i a
a2 = Array.slice (i+1) (Array.length a) a
in
Array.append a1 a2
【讨论】:
使用elm-community 中的List.Extra.removeAt。
【讨论】:
我最近需要一个indexedFilter 函数。这可以为您提供基于折叠的替代方案
indexedFilter : (Int -> a -> Bool) -> List a -> List a
indexedFilter p xs =
let
tup = List.map2 (,) [ 0 .. List.length xs - 1 ] xs
in List.foldr (\(i,x) acc -> if p i x then x :: acc else acc) [] tup
【讨论】:
这是基于 J 的 from 的另一种解决方案。
用法:
[-1,2,0] `from` ["fran","world","san","hello"]
返回:[Just "hello",Just "san",Just "fran"]
定义,在import List exposing (..)之后:
get idx lst = -- get an element from a list (negative indexes from end)
if idx >= 0 then
head (drop idx lst)
else
head (drop (negate (idx+1)) (reverse lst))
from idxs lst = -- atoms of idxs are indexes into lst
case idxs of
hd::tl -> (get hd lst)::(from tl lst)
_ -> []
【讨论】:
“elm-community/array-extra”包现在提供了这个功能:
https://package.elm-lang.org/packages/elm-community/array-extra/2.1.0/Array-Extra#removeAt
【讨论】: