2016-02-20 11 views
21

मैं इस प्रकार एक सूची में एक नया तत्व जोड़ने के लिए कोशिश कर रहा था जोड़ें:नए तत्व सूची

iex(8)> l = [3,5,7,7,8] ++ 3 
[3, 5, 7, 7, 8 | 3] 
iex(9)> l 
[3, 5, 7, 7, 8 | 3] 

मैं क्यों

8 | 3 

की तरह 5 वीं स्थिति पर मिला यह क्या मतलब है?
और मैं सूची में नया तत्व कैसे जोड़ सकता हूं?

-------- अद्यतन --------
मैं पाश करने के लिए इस प्रकार की सूची की कोशिश:

iex(2)> l = [1,2] ++ 3 
[1, 2 | 3] 
iex(3)> Enum.each(l, fn(x) -> IO.puts(x) end) 
1 
2 
** (FunctionClauseError) no function clause matching in Enum."-each/2-lists^foreach/1-0-"/2 
    (elixir) lib/enum.ex:604: Enum."-each/2-lists^foreach/1-0-"(#Function<6.54118792/1 in :erl_eval.expr/5>, 3) 
    (elixir) lib/enum.ex:604: Enum.each/2 

नंबर 2 के सूचक के बाद से नहीं है एक सूची की ओर इशारा करते हुए, मूल्य 3 के बजाय, मैं सूची को कैसे लूप कर सकता हूं?

+0

। यह नोटेशन एक अनुचित सूची का संकेत दे रहा है। –

उत्तर

25

++ ऑपरेटर दो सूचियों को संयोजित करने के लिए है, तो हो सकता है कि आप एक नया तत्व जोड़ने के लिए क्या करना चाहते हैं, इसे एक सूची में रखना है।

आईईएक्स (2)> एल = [3,5,7,7,8] ++ [3]

[3: तो फिर, मैं तुम्हें एक और सूची में जोड़ना चाहिए लगता है , 5, 7, 7, 8, 3]

+0

लेकिन मैं जानना चाहता हूं कि '8 | 3'mean? –

+2

एलिक्सीर में सूचीबद्ध सूची सूचियां हैं। ए | बी का मतलब है कि सेल ए का सूचक बी को इंगित कर रहा है। आपके मामले में, इसका मतलब है कि आपकी सूची का अंतिम तत्व उस तत्व को इंगित कर रहा है जो 3. –

+4

@ सल्वाडोर मैडेना नो स्टोर करता है, इस मामले में '8 | 3' एक अनुचित सूची इंगित करता है। Google "Elixir अनुचित सूची" और आप देखेंगे कि यह क्या है। –

-4

"आई" का अर्थ है कि सूची सिर और पूंछ में विभाजित है [हेड | पूंछ]। यदि आप पैटर्न को सूची से मेल खाते हैं तो आप सूची के दोनों हिस्सों में हेरफेर कर सकते हैं और concatenation के लिए ++ ऑपरेटर का उपयोग कर सकते हैं।

5

पहला: [1, 2 | 3] improper list के लिए संकेत है।

दूसरा: Enum.each आप एक अनुचित सूची कोड इस प्रकार दिखाई देगा के साथ क्या करने की कोशिश कर रहे हैं करने के लिए: उचित/अनुचित सूचियों के विरुद्ध

मिलान तदनुसार आसान है। तो उचित सूचियों के लिए लंबाई फ़ंक्शन लेन:

लेन ([_ | टी]) -> 1 + लेन (टी); लेन ([]) -> 0. जहां हम स्पष्ट रूप से को समाप्त कर रहे हैं []। यदि एक अनुचित सूची दी गई है तो यह त्रुटि उत्पन्न करेगी। जबकि फ़ंक्शन last_tail जो सूची की अंतिम पूंछ लौटाता है, अनुचित सूचियों को भी संभाल सकता है:

last_tail ([_ | टी]) -> last_tail (टी); last_tail (पूंछ) -> पूंछ।
% किसी भी पूंछ

यही है, जाहिर है, Erlang code from @rvirding से मेल खाएगी। अमृत ​​के लिए अनुवादित और मुद्रण आप अपने उदाहरण में देना करने के लिए अनुवाद है, यह इस तरह दिखना चाहते हैं:

iex(6)> defmodule T do 
...(6)> defp print([h|t]) do 
...(6)>  IO.puts(h) 
...(6)>  print(t) 
...(6)> end 
...(6)> defp print(t) do 
...(6)>  IO.puts(t) 
...(6)> end 
...(6)> def print_improper_list(il), do: print(il) 
...(6)> end 
iex:6: warning: redefining module T 
{:module, T, 
<<70, 79, 82, 49, 0, 0, 5, 136, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 161, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>, 
{:print_improper_list, 1}} 
iex(7)> T.print_improper_list([1,2,3|4]) 
1 
2 
3 
4 
:ok 

मैं एक व्यायाम के रूप में छोड़ आप एक Enum.each साथ कि कैसे करना है यह पता लगाने के लिए।

18

बस सूची के लिए एक तत्व जोड़ने के लिए (और मन में प्रदर्शन रखने =)) अमृत डॉक्स का पालन करें:

iex> list = [1, 2, 3] 
iex> [0 | list] # fast 
[0, 1, 2, 3] 
iex> list ++ [4] # slow 
[1, 2, 3, 4] 

https://hexdocs.pm/elixir/List.html

गूगल "अमृत अनुचित सूची" के लिए
+4

क्योंकि एलिक्सीर/एरलांग में सूचियां आंतरिक रूप से लिंक्ड सूचियां हैं, इसलिए सूची के सामने जोड़ना एक है तेजी से संचालन क्योंकि आपको सूची की पूंछ पर लिंक को फिर से बनाने की आवश्यकता नहीं है। इसलिए सूची के अंत में तत्व जोड़ने के लिए लिंक की गई सूची को सभी लिंक को फिर से पीछे से फिर से बनाने की आवश्यकता होगी। –

+0

मुझे समझ में नहीं आया कि एक लिंक्ड सूची में तत्व को कैसे जोड़ना कम्प्यूटेशनल रूप से महंगा हो सकता है, जब तक कि मैंने इस स्निपेट को तब तक सस्ता नहीं देखा, जो सूची के अंतर्गत विपक्षी कोशिकाओं को दिखाता है: 'iex> [1 | [2 | [3 | []]]] [1, 2, 3] ' –

संबंधित मुद्दे