স্কালায় তালিকায় আইটেম পাবেন?


205

কিভাবে বিশ্বের আপনি সূচিতে মাত্র একটি উপাদান পেতে পারি আমি Scala মধ্যে তালিকা থেকে?

আমি চেষ্টা করেছি get(i), এবং [i]- কিছুই কাজ করে না। গুগলিং কেবল তালিকার একটি উপাদানকে কীভাবে "সন্ধান" করতে পারে তা ফিরিয়ে দেয়। তবে আমি ইতিমধ্যে উপাদানটির সূচকটি জানি!

এখানে কোডটি সংকলন করে না:

def buildTree(data: List[Data2D]):Node ={
  if(data.length == 1){
      var point:Data2D = data[0]  //Nope - does not work

  }
  return null
}

তালিকার এপিআইটি দেখলে কোনও লাভ হয় না, কারণ আমার চোখ সবেমাত্র ক্রস করে।


1
ঠিক আছে, দেখে মনে হচ্ছে ডেটা হেড কাজ করেছে ... তবে এখনও এটি আমাকে প্রথম উপাদান দেয়, তালিকার কোনওটিই নয়।
অ্যান্ড্রি দ্রোজডিয়ুক

আপনি যদি নিশ্চিত হন যে সূচি সীমা ছাড়িয়েছে না সিক বৈশিষ্ট্য প্রয়োগ (সূচক) ব্যবহার করুন । scala-lang.org/api/current/...
Beezer

ডেটা.ড্রপ (i) .হেতু আই-থ উপাদানটি অ্যাক্সেস করার জন্য কাজ করে
বিনয়

@ বিনে এটি একটি ব্যয়বহুল অপারেশন। সুতরাং "ড্রপ (i)। হেড" এড়ানো উচিত।
শুভম অগ্রওয়াল

উত্তর:


305

বন্ধনী ব্যবহার করুন:

data(2)

তবে লিঙ্কযুক্ত তালিকাগুলি সময় কাটাতে সময় নেয় বলে আপনি প্রায়শই তালিকাগুলির সাথে এটি করতে চান না। আপনি যদি কোনও সংগ্রহের সূচক করতে চান, Vector(অপরিবর্তনীয়) বা ArrayBuffer(পরিবর্তনযোগ্য) বা সম্ভবত ব্যবহার করুন Array(যা কেবল একটি জাভা অ্যারে, আপনি আবার এর (i)পরিবর্তে এর সাথে সূচী করেন [i])।


1
মূলত আমি জাভাতে অ্যারেলিস্টের মতো কিছু খুঁজছি। আমার ধারণা অপরিবর্তনীয়ও ঠিক থাকবে।
অ্যান্ড্রি দ্রোজডিয়ুক

1
ArrayBufferমত কাজ করে ArrayListVectorঅপরিবর্তনীয় মতো কাজ করে - ArrayListআপনি পড়তে পারেন তবে নতুন তৈরি না করে আপনি লিখতে পারবেন না।
রেক্স কের

সাবলিস্ট সম্পর্কে কীভাবে? উদাহরণস্বরূপ জাভাতে আমি "ডেটা.সুবলিস্ট (0, সূচক)" করি।
অ্যান্ড্রি দ্রোজডিয়ুক

কিছু নয়, আমি পেয়েছি - এটি "স্লাইস"! আমি কি অ্যারেবফারকে ভেক্টরে রূপান্তর করতে পারি? বা আরও সাধারণ ধরণের কি আমি পদ্ধতিগুলি থেকে ফিরে আসতে পারি? জাভা উদাহরণস্বরূপ আমি তালিকা ইন্টারফেস ফিরে আসবে।
অ্যান্ড্রি দ্রোজডিয়ুক

1
আপনি ArrayBufferএকটি IndexedSeqব্যবহার রূপান্তর করতে পারেন .toIndexedSeq; IndexedSeqআরও জেনেরিক টাইপ। ( এক্ষেত্রে এটি বাস্তবে রূপান্তরিত হয় ক Vector।) IndexedSeqসংগ্রহের সুপারটাইপ যা সূচকে যুক্তিসঙ্গত। এছাড়াও, নোট করুন যে আপনি করতে পেরেছিলেন Vector() ++ myArrayBufferযা প্রায় কোনও সংগ্রহের জন্য কাজ করবে (উভয় পক্ষেই)। ++আপনার নির্দিষ্ট দুটি থেকে নতুন সংগ্রহ তৈরি করে, বাম দিকের প্রকারটি সংরক্ষণ করে। Vector()খালি ভেক্টর, তাই এটি আপনি যা চান তা উত্পাদন করে।
রেক্স কের

121

নিরাপদটি ব্যবহার করা হয় liftযাতে আপনি যদি এটি উপস্থিত থাকে তবে মানটি বের করতে পারেন এবং যদি তা না থেকে করুণভাবে ব্যর্থ হন।

data.lift(2)

তালিকাটি উপাদানটি সরবরাহ করার জন্য যথেষ্ট দীর্ঘ না হলে এবং কোনওটি যদি (মান) থাকে তবে এটি কোনও কিছুই প্রত্যাবর্তন করবে না।

scala> val l = List("a", "b", "c")
scala> l.lift(1)
Some("b")
scala> l.lift(5)
None

যখনই আপনি কোনও অপারেশন করছেন যা এইভাবে ব্যর্থ হতে পারে তবে একটি বিকল্প ব্যবহার করা এবং উপাদানটির অস্তিত্ব নেই এমন ক্ষেত্রে আপনি পরিচালনা করছেন তা নিশ্চিত করতে সহায়তা করার জন্য টাইপ সিস্টেমটি পাওয়া দুর্দান্ত।

ব্যাখ্যা:

এটি কাজ করে কারণ তালিকার apply(যা কেবলমাত্র প্রথম বন্ধনীর জন্য শর্করা, উদাহরণস্বরূপ l(index)) একটি আংশিক ফাংশনের মতো যা তালিকার কোনও উপাদান রয়েছে সেখানেই সংজ্ঞায়িত করা হয়। List.liftপদ্ধতি আংশিক সক্রিয় applyফাংশন (ক ফাংশন যা শুধুমাত্র কিছু ইনপুট জন্য নির্ধারণ করা থাকে) মূলত একটি বিকল্প ফলাফলের মোড়কে একটি স্বাভাবিক ফাংশন (যে কোন ইনপুট জন্য সংজ্ঞায়িত) মধ্যে।


11
উত্তোলন সুন্দর। অ্যারের আকার পরীক্ষা না করে আমি অ্যারেআইডেক্সআউটআউটবাউন্ড ত্রুটিগুলি এড়াতে পারি ..
নবীন

9

বন্ধনী কেন?

স্ক্যালায় বইয়ের প্রোগ্রামিংয়ের উদ্ধৃতি এখানে ।

এই উদাহরণ দ্বারা চিত্রিত আরেকটি গুরুত্বপূর্ণ ধারণা আপনাকে স্ক্যালায় বন্ধনীর সাহায্যে অ্যারে কেন অ্যাক্সেস করা হয় তা অন্তর্দৃষ্টি দেবে। স্কালায় জাভার চেয়ে কম বিশেষ মামলা রয়েছে। অ্যারেগুলি কেবল স্কালার অন্যান্য শ্রেণীর মতো ক্লাসের উদাহরণ। আপনি যখন ভেরিয়েবলের এক বা একাধিক মানের চারপাশে প্রথম বন্ধনী প্রয়োগ করেন, স্কালা কোডটি সেই ভেরিয়েবলের উপরে প্রয়োগ নামের একটি পদ্ধতির অনুরোধে রূপান্তরিত করে। সুতরাং গ্রিটিস্ট্রিংস (আই) গ্রেটসট্রিংস এপ্লাই করে app সুতরাং স্কেলে একটি অ্যারের উপাদান অ্যাক্সেস করা সহজভাবে অন্য যেকোন পদ্ধতির কল। এই নীতিটি অ্যারেগুলিতেই সীমাবদ্ধ নয়: বন্ধনীগুলিতে কিছু আর্গুমেন্টে কোনও বস্তুর কোনও প্রয়োগ প্রয়োগ পদ্ধতি কলে রূপান্তরিত হবে। অবশ্যই এটি কেবল তখনই সংকলন করবে যদি সেই ধরণের অবজেক্টটি আসলে প্রয়োগের পদ্ধতিটি নির্ধারণ করে। সুতরাং এটি কোনও বিশেষ ক্ষেত্রে নয়; এটি একটি সাধারণ নিয়ম।

ফাংশনাল প্রোগ্রামিং স্টাইল ব্যবহার করে নির্দিষ্ট উপাদান (এই ক্ষেত্রে প্রথম এলেম) কীভাবে টানতে হবে তার কয়েকটি উদাহরণ এখানে রয়েছে।

  // Create a multdimension Array 
  scala> val a = Array.ofDim[String](2, 3)
  a: Array[Array[String]] = Array(Array(null, null, null), Array(null, null, null))
  scala> a(0) = Array("1","2","3")
  scala> a(1) = Array("4", "5", "6")
  scala> a
  Array[Array[String]] = Array(Array(1, 2, 3), Array(4, 5, 6))

  // 1. paratheses
  scala> a.map(_(0))
  Array[String] = Array(1, 4)
  // 2. apply
  scala> a.map(_.apply(0))
  Array[String] = Array(1, 4)
  // 3. function literal
  scala> a.map(a => a(0))
  Array[String] = Array(1, 4)
  // 4. lift
  scala> a.map(_.lift(0))
  Array[Option[String]] = Array(Some(1), Some(4))
  // 5. head or last 
  scala> a.map(_.head)
  Array[String] = Array(1, 4)


0

আজকাল সূচকের মাধ্যমে কোনও তালিকার ডেটা অ্যাক্সেস করার জন্য এটি পছন্দসই উপায়:

scala> val list = List("a","b","c")
scala> list.get(1)
Some("b")
scala> list.get(5)
None

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.