假设我有一个列表<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".Main.MainActivity"
tools:showIn="@layout/activity_main">
<android.support.v4.view.ViewPager
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/viewPager"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
如何获取此列表中除最后一个之外的所有元素?所以,我会[1, 2, 3, 4]
答案 0 :(得分:26)
像这样使用Enum.drop / 2:
list = [1, 2, 3, 4]
Enum.drop list, -1 # [1, 2, 3]
答案 1 :(得分:17)
我的解决方案(我认为它不干净,但它有效!)
a = [1, 2, 3, 4]
[head | tail] = Enum.reverse(a)
Enum.reverse(tail) # [1, 2, 3]
答案 2 :(得分:2)
除了前面提到的list |> Enum.reverse |> tl |> Enum.reverse
之外的另一个选项是Erlang的:lists.droplast
函数,根据文档的说法,它的速度较慢,但由于它没有创建两个新列表,因此产生的垃圾更少。根据您的使用情况,可能是一个有趣的用例。
答案 3 :(得分:1)
如果您希望同时获得最后一项和列表中的其余项,您现在可以使用List.pop_at/3
:
{last, rest} = List.pop_at([1, 2, 3], -1)
{3, [1, 2]}
答案 4 :(得分:0)
另一个选择,虽然不优雅,但是 -
list = [1, 2, 3, 4]
Enum.take(list, Enum.count(list) -1 ) # [1, 2, 3]
答案 5 :(得分:0)
Erlang
List = [1,2,3,4,5],
NewList = DropLast(List).
DropLast(List) while length(List) > 0 and is_list(List) ->
{NewList, _} = lists:split(OldList, length(OldList)-1),
NewList.