ক্লোজারে তালিকার ধরণের মধ্যে রূপান্তর করার জন্য কি সহজ উপায় আছে?


92

যখন আমি কোনও ভেক্টর চাই তখন আমি প্রায়শই নিজেকে অলস তালিকাটি ব্যবহার করে এবং তার বিপরীতে খুঁজে পাচ্ছি। এছাড়াও, কখনও কখনও আমার কাছে মানচিত্রের ভেক্টর থাকে যখন আমি সত্যিই মানচিত্রের সেট চাইতাম। আমাকে এই ধরণের মধ্যে রূপান্তর করতে সাহায্য করার জন্য কোনও সহায়ক ফাংশন রয়েছে কি?

উত্তর:


147

আসুন ভুলে বিশ্বাসভাজন পুরাতন যে intoআপনি কিছু নিতে দেয় seqসক্ষম (তালিকা, ভেক্টর, মানচিত্র, সেট, সাজানো মানচিত্রে) এবং একটি খালি কন্টেইনারে আপনি ভরা চান, এবং এটা বন্ধ রাখে intoএটা।

(into [] '(1 2 3 4)) ==> [1 2 3 4]         "have a lazy list and want a vector"
(into #{} [1 2 3 4]) ==> #{1 2 3 4}        "have a vector and want a set"
(into {} #{[1 2] [3 4]}) ==> {3 4, 1 2}    "have a set of vectors want a map"
(into #{} [{1 2} {3 4}]) ==> #{{1 2} {3 4}} "have a vector of maps want a set of maps"

intoআশেপাশের একটি মোড়ক conj, যা সংগ্রহের ধরণের ভিত্তিতে নতুন এন্ট্রিগুলি যথাযথভাবে সন্নিবেশ করানোর জন্য বেস বিমূর্ততা। ঠিক যে এই প্রবাহ যাতে সুন্দরভাবে করে তোলে Clojure মধ্যে build হয় composable বিমূর্ত এই ক্ষেত্রে intoশীর্ষে conjসংগ্রহ উপরের এবং এর seq

উপরোক্ত উদাহরণগুলি এখনও ভালভাবে রচনা করতে পারে যদি প্রাপকটি রান সময়ে পাস করা হত: কারণ অন্তর্নিহিত বিমূর্ততা ( seqএবং conj) সমস্ত সংগ্রহের জন্য প্রয়োগ করা হয়েছে (এবং জাভা এর অনেকগুলি সংগ্রহও), তাই উচ্চতর বিমূর্ততাগুলি উদ্বেগের দরকার নেই প্রচুর বিশেষ ডেটা সম্পর্কিত কোণার কেস সম্পর্কে about


4
+1 এর জন্য ... লক্ষণীয় যে এটি খালি খালি মূল
পাত্রেও কাজ করে

11
এটিও লক্ষণীয় যে কারণ intoব্যবহারগুলি conjকরার (into '() some-seq)ফলে একটি তালিকা পাওয়া যাবে যা কিছু সেকের বিপরীত , কারণ conjতালিকায় কনসেস।
চক

এটি intoঅন্যান্য যে কোনও রূপান্তর পদ্ধতির চেয়ে ভাল পারফরম্যান্স বৈশিষ্ট্যের জন্য ট্রান্সিয়েন্টগুলি (বেশিরভাগ সেক প্রকারের জন্য) ব্যবহার করে তা লক্ষণীয়।
জারেড হামফ্রে

এবং এটি এখন ট্রান্সডুসারদের সাথে কাজ করে, যা এই উত্তরটি লেখার সময় উপস্থিত ছিল না (ট্রানজিস্টরা কোনও হয়েছে কিনা তা আমি জানি না) (কিন্ডারগার্টেনে নাম
লেখানোর

33

vec, setএবং সাধারণত intoআপনার সংগ্রহগুলি সহজেই অন্য সংগ্রহের ধরণে "রূপান্তর" করতে পারে।

আপনি কীভাবে মানচিত্রের কোনও ভেক্টরকে মানচিত্রের মানচিত্রে রূপান্তর করতে চান? আপনার একটি চাবি দরকার, আপনি কি নমুনা ইনপুট / প্রত্যাশিত আউটপুট ব্যবহার করতে পারবেন?


দুঃখিত, আমি মানচিত্রের একটি সেট বোঝাতে চাইছি .. আমি এখনই প্রশ্নটি সংশোধন করেছি
appshare.co

22

ভেক্টরগুলির জন্য vecফাংশন রয়েছে

user=> (vec '(1 2 3))
[1 2 3]

অলস ক্রমগুলির জন্য lazy-seqফাংশন রয়েছে

user=> (lazy-seq [1 2 3])
(1 2 3)

সেটগুলিতে রূপান্তর করার জন্য, এখানে setফাংশন রয়েছে

user=> (set [{:a :b, :c :d} {:a :b} {:a :b}])
#{{:a :b} {:a :b, :c :d}}

4
আপনার যখন অ-অলস কলিংয়ের lazy-seqপরিবর্তে seqকেবল একটি অকেজো নির্দেশিকা যুক্ত করে। যদি সত্যিই আপনি কিছু খালি সংগ্রহ করতে চান তবে সেখানে কিছু ফিরিয়ে দিতে চান sequencelazy-seqকিছুটা নিম্ন স্তরের নির্মাণ const
সিগ্র্যান্ড

14

(সম্পূর্ণতার স্বার্থে) একটি মানচিত্রে একটি তালিকা থেকে রূপান্তরের জন্য আরও একটি উত্তর - থেকে এখানে :

(apply hash-map '(1 2 3 4))
;=>{1 2, 3 4}

9

কোনও ভেক্টরকে একটি তালিকায় রূপান্তর করতে আপনি এগুলিও ব্যবহার করতে পারেন for:

=> (for [i [1 2 3 4]] i)
(1 2 3 4)

আপনি যখন ডেটা ম্যানিপুলেট করতে চান না, কেবল seqভেক্টরে ব্যবহার করুন:

=> (seq [1 2 3])
(1 2 3)

পরিবর্তে forআপনি কেবল করতে পারেন(map identity [1 2 3 4])
সিল্টালাউ

7

কোনও ভেক্টরকে একটি তালিকায় রূপান্তর করার দরকার নেই । ক্লোজ্যুর একটি ভেক্টরকে যেমন একটি তালিকার সাথে বিবেচনা করে - সিক্যুয়েন্স হিসাবে - যখন সিকোয়েন্সের প্রয়োজন হয় treat উদাহরণ স্বরূপ,

user=> (cons 0 [1 2 3])
(0 1 2 3)

আপনার যদি ভেক্টরটিকে একটি অনুক্রম হিসাবে বিবেচনা করা হচ্ছে তা নিশ্চিত করার দরকার হয় তবে এটিকে মোড়ানো করুন seq:

user=> (conj [1 2 3] 0) ; treated as a vector
[1 2 3 0]

user=> (conj (seq [1 2 3]) 0) ; treated as a sequence
(0 1 2 3)

আপনার যদি মানচিত্রের ভেক্টর থাকে এবং আপনি মানচিত্রের সেট চান তবে ভেক্টর মানচিত্র রাখে তা বিবেচ্য নয়। আপনি কেবল ভেক্টরকে যথারীতি একটি সেটে রূপান্তরিত করেছেন:

user=> (set [{:a 1, :b 2} {"three" 3, "four" 4}])
#{{:a 1, :b 2} {"four" 4, "three" 3}}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.