স্কেল: অ্যারেতে কোনও উপাদান যুক্ত করার সর্বোত্তম উপায় কী?


111

বলুন আমার একটা Array[Int]পছন্দ আছে

val array = Array( 1, 2, 3 )

এখন আমি অ্যারের সাথে একটি উপাদান যুক্ত করতে চাই 4, নিম্নোক্ত উদাহরণ হিসাবে যেমন মান বলি :

val array2 = array + 4     // will not compile

আমি অবশ্যই System.arraycopy()এটি নিজেই ব্যবহার করতে এবং করতে পারি, তবে এর জন্য অবশ্যই একটি স্কালা লাইব্রেরি ফাংশন থাকতে হবে, যা আমি সন্ধান করতে পারি না। কোন পয়েন্টার জন্য ধন্যবাদ!

মন্তব্য:

  1. আমি সচেতন যে আমি নীচের লাইনের মতো উপাদানগুলির আর একটি অ্যারে সংযুক্ত করতে পারি তবে এটি প্রায় গোলাকার মনে হয়:

    val array2b = array ++ Array( 4 )     // this works
  2. আমি তালিকা বনাম অ্যারে এর সুবিধাগুলি এবং অপূর্ণতা সম্পর্কে সচেতন এবং এখানে আমি বিভিন্ন কারণে বিশেষত আগ্রহী অ্যারে প্রসারিত করতে আগ্রহী।

সম্পাদনা 1

:+অপারেটর পদ্ধতির দিকে নির্দেশিত উত্তরের জন্য ধন্যবাদ । এই আমি খুঁজছিলাম ছিল। দুর্ভাগ্যক্রমে, এটি ব্যবহার করে একটি কাস্টম অ্যাপেন্ড () পদ্ধতি প্রয়োগের চেয়ে ধীর arraycopy- প্রায় দুই থেকে তিনগুণ ধীর। বাস্তবায়নের দিকে তাকালে SeqLike[]একটি বিল্ডার তৈরি করা হয়, তারপরে অ্যারে যুক্ত করা হয়, তারপরে সংযোজনটি বিল্ডারের মাধ্যমে করা হয়, তারপরে বিল্ডারকে রেন্ডার করা হয়। অ্যারেগুলির জন্য একটি ভাল বাস্তবায়ন নয়। আমি দুটি পদ্ধতির তুলনায় একটি দ্রুত বেঞ্চমার্ক করেছি, দশটি চক্রের মধ্যে দ্রুততম সময়ের দিকে তাকিয়ে। কিছু শ্রেণীর 8-উপাদান অ্যারের উদাহরণগুলিতে একক আইটেমের 10 মিলিয়ন পুনরাবৃত্তিগুলি করা একটি সহজ পদ্ধতি যা ব্যবহার করে Foo3.1 সেকেন্ড :+এবং 1.7 সেকেন্ড লাগেappend()System.arraycopy();লং-এর 8-উপাদান অ্যারেগুলিতে 10 মিলিয়ন একক-আইটেম সংযোজন পুনরাবৃত্তিগুলি :+করতে সাধারণ append()পদ্ধতির সাথে 2.1 সেকেন্ড এবং 0.78 সেকেন্ড লাগে । ভাবছেন যদি কাস্টম বাস্তবায়নের সাথে লাইব্রেরিতে এটি স্থির করা যায় না Array?

সম্পাদনা 2

এটির মূল্যের জন্য, আমি একটি টিকিট দায়ের করেছি: https://issues.scala-lang.org/browse/SI-5017


11
কেন ব্যবহার করবেন না ArrayBufferএবং এর +=পদ্ধতি? এটি আপনাকে এমোরিটাইজড ও (1) সংযোজন দেবে।
ফ্রেড ফু

1
Scala সালে System.arraycopy(...)দ্বারা প্রতিস্থাপিত হয়Array.copy(...)
paradigmatic

1
তালিকা বনাম অ্যারে এর সুবিধাগুলি এবং ত্রুটিগুলি সম্পর্কে আপনি অবগত আছেন, তবে 10 মিলিয়ন পরিশিষ্টের বেঞ্চমার্কের ফলাফল নিয়ে অবাক?
ব্যবহারকারী অজানা

অ্যারেতে সর্বশেষ সংযোজনের ArrayBufferপরে রূপান্তরিত হওয়া এমনটি ব্যবহার করে আপনি কী আবার আপনার বেঞ্চমার্কটি চালাতে পারেন ? toArray
21:39

@ প্রস্তুতিমূলক: অবশ্যই বেঞ্চমার্ক একই অ্যারেতে 10 মিলিয়ন সংযোজন নয়, তবে 8-উপাদান অ্যারেতে সংযুক্ত একক আইটেমের 10 মিলিয়ন পুনরাবৃত্তি। আমি সেই অনুযায়ী প্রশ্ন আপডেট করেছি।
গ্রেগর স্কিডেট

উত্তর:


204

আপনি :+অ্যারেতে উপাদান সংযোজন করতে এবং এটি পুনরায় যোগ করতে ব্যবহার করতে পারেন +::

0 +: array :+ 4

উত্পাদন করা উচিত:

res3: Array[Int] = Array(0, 1, 2, 3, 4)

এটি অন্য কোনও বাস্তবায়নের মতোই Seq


3
এটা একই অন্য কোনো Scala হয় আদেশ সংগ্রহ, এটা উদাহরণস্বরূপ সেট দিয়ে কাজ করে না (শুরুতে যোগ এবং যোগ করা আছে একটি সেট জন্য গড় কিছু)।
নিকোলাস

@ নিকোলাস যেকোন অনুক্রম অর্ডার করা বাছাই করা বোঝা ।
ড্যানিয়েল সি সোব্রাল

@ ড্যানিয়েল হ্যাঁ, আমি মন্তব্যটি লেখার সময় আমার একটি ছোট স্মৃতির গর্ত ছিল এবং আমি স্পষ্ট শব্দটি "সিকোয়েন্স" খুঁজে পাইনি
নিকোলাস

@ টেনশি এই সমস্ত অপারেটররা কি নতুন অ্যারে তৈরি করবেন? হ্যাঁ, এটি করে (থেকে: + কোড)Array.copy(repr, 0, result, 0, repr.length)
টিমোফায়

59
val array2 = array :+ 4
//Array(1, 2, 3, 4)

কাজগুলি "বিপরীত":

val array2 = 4 +: array
Array(4, 1, 2, 3)

একটি "ইন-প্লেস" সংস্করণও রয়েছে:

var array = Array( 1, 2, 3 )
array +:= 4
//Array(4, 1, 2, 3)
array :+= 0
//Array(4, 1, 2, 3, 0)

11
আমি কেবল অবাক হয়েছি কেন অ্যারে সংগ্রহ কেন অ্যারেবফার হিসাবে অ্যাপেন্ড () পদ্ধতিটি ব্যবহার করে না। আমার মতে, এটি একটি নতুন অপারেটর ব্যবহার করার চেয়ে আরও সমন্বয় এবং একত্রিত: + / +:
জেজেভু

8

সবচেয়ে সহজ হতে পারে:

Array(1, 2, 3) :+ 4

আসলে, অ্যারে অনিচ্ছাকৃতভাবে একটি এ রূপান্তর করা যেতে পারে WrappedArray


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