মান দ্বারা অ্যারে থেকে আমি কীভাবে একটি উপাদান মুছতে পারি


343

আমার কাছে রুবিতে উপাদানগুলির একটি অ্যারে রয়েছে

[2,4,6,3,8]

3উদাহরণস্বরূপ আমার মান সহ উপাদানগুলি সরিয়ে ফেলতে হবে

আমি কেমন করে ঐটি করি?


আমি ভাবছি কেন delete array.delete(3)
— রেলস

2
active recordপদ্ধতির কারণে হতে পারেdelete
— ইমরাননাকভি

উত্তর:


481

আমি মনে করি আমি এটি বের করেছি:

a = [3, 2, 4, 6, 3, 8]
a.delete(3)
#=> 3
a
#=> [2, 4, 6, 8]

189
আমি ব্যক্তিগতভাবে পছন্দ করি [1, 2, 3, 4, 5] - [3]যা => [1, 2, 4, 5]থেকে ফলাফল আসে irb।
— ট্র্যাভিস

24
যদি 3 টির একাধিক এন্ট্রি থাকে এবং আমরা তাদের মধ্যে একটি মুছতে চাই? (এটি সম্পর্কিত যা তাই এখানে জিজ্ঞাসা করা ভাল হতে পারে)
— নবনিট

113
কেবল একটি শিরোনাম যে .delete () মুছে ফেলা মানটি ফিরিয়ে দেবে, মুছে ফেলা মান সহ পরিবর্তিত অ্যারে নয়।
— জোশুয়া পিন্টার 27'13

23
বিবেচনা করার অন্যান্য পরিণতি হ'ল deleteঅন্তর্নিহিত অ্যারেটিকে পরিবর্তন করে যেখানে -মুছে যাওয়া মান ব্যতীত একটি নতুন অ্যারে তৈরি করে (এটি আপনাকে ফিরিয়ে দেওয়া হয়)। আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে হয় পদ্ধতির অর্থ হতে পারে।
— srt32

2
@ ব্যবহারকারীর ৩21১২৪৪২, মুছে ফেলুন (৩) পজিশনে অবস্থিত উপাদানটির উল্লেখ করে না তবে পরিবর্তে পূর্ণসংখ্যার সাথে মেলে এমন কোনও উপাদান মুছে ফেলবে It এটি 3 এর সমস্ত উপস্থিতি সরিয়ে ফেলবে এবং অ্যারে সূচক বা অবস্থানের সাথে কোনও সম্পর্ক নেই।
— বকুনজি01

226

মন্তব্যে ট্র্যাভিসের কাছ থেকে ধার নেওয়া , এটি আরও উত্তম উত্তর:

আমি ব্যক্তিগতভাবে পছন্দ করি [1, 2, 7, 4, 5] - [7]যা => [1, 2, 4, 5]থেকে ফলাফল আসেirb

আমি তার উত্তরটি সংশোধন করে দেখলাম যে 3 তার উদাহরণ অ্যারে তৃতীয় উপাদান। এটি তাদের জন্য কিছু বিভ্রান্তির কারণ হতে পারে যারা বুঝতে পারেন না যে অ্যারেতে 3 পজিশনে রয়েছে।


21
উত্তরে srt32 পয়েন্ট হিসাবে, ব্যবহার .deleteএবং এর মধ্যে গুরুত্বপূর্ণ পার্থক্য রয়েছে -। .deleteঅ্যারে থেকে মুছে ফেলা মানটি যদি ফিরিয়ে দেয়; -হবে না. সুতরাং [ 1, 2, 3 ] - [ 2 ]ফিরে আসবে [ 1, 3 ], যখন [ 1, 2, 3 ].delete( 2 )ফিরে আসবে 2।
— আরগুস 9

5
array - subArrayঅ্যারে অ্যারের জন্য কাজ করবে না , তবে array.delete(subArray)করবে।
— শচীন 12

20
[1,2,3] - [2]এবং এর মধ্যে অত্যন্ত গুরুত্বপূর্ণ পার্থক্যটি [1,2,3].delete(2)হল যে deleteপদ্ধতিটি মূল অ্যারেটি সংশোধন করে , যখন [1,2,3] - [3]একটি নতুন অ্যারে তৈরি করে ।
— টিমোথি কোভালেভ

পুনরায় সাবহারে (@ উপরে শচিনের মন্তব্য) "এটি অবশ্যই হবে", আপনাকে কেবল স্বরলিপিটি সঠিকভাবে পাওয়া দরকার: [1,2,[2],2,3,4] - [2]আপনাকে দেয় [1, [2], 3, 4], তবে [1,2,[2],2,3,4] - [[2]]আপনাকে দেয় [1, 2, 2, 3, 4]। :-)
— টম হুন্ড


50

আমি নিশ্চিত যে কেউ এটি বলেছে কিনা, তবে অ্যারে.ডিলেট () এবং - = মান অ্যারের মধ্যে যে মানটি দিয়ে গেছে তার প্রতিটি উদাহরণ মুছে ফেলবে। নির্দিষ্ট উপাদানটির প্রথম উদাহরণটি মুছতে আপনি এমন কিছু করতে পারেন

arr = [1,3,2,44,5]
arr.delete_at(arr.index(44))

#=> [1,3,2,5]

একটি সহজ উপায় হতে পারে। আমি বলছি না এটি সেরা অনুশীলন, তবে এটি এমন একটি বিষয় যা স্বীকৃত হওয়া উচিত।


1
আমি এটি করার জন্য একটি উপায় খুঁজছিলাম এবং কেবলমাত্র সদৃশগুলির উপাদানটির একটি উদাহরণ মুছলাম এবং এটি দুর্দান্ত কাজ করবে!
— xeroshogun

আমি মনে করি এই উত্তরটি ভুল, কেবলমাত্র এ কারণেই arr.index () যেতে পারেnil
— উইন্ডমায়াও

32

ধরে নিই যে আপনি অ্যারেতে একাধিক স্থানে মান দিয়ে 3 টি মুছতে চান, আমি মনে করি এই কাজটি করার রুবি উপায়টি মুছে ফেলা_আইফ পদ্ধতিটি ব্যবহার করা হবে:

[2,4,6,3,8,3].delete_if {|x| x == 3 } 

আপনি 'অ্যারের অ্যারে' এর দৃশ্যে উপাদানগুলি সরানোর জন্য মুছুন_আইফ ব্যবহার করতে পারেন।

আশা করি এটি আপনার প্রশ্নের সমাধান করেছে


25

-=[4]যার মান 4 হয় এমন উপাদানগুলি মুছতে অন্য উত্তরে বর্ণিত উপায়টি আমার পছন্দ হয় ।

তবে এই উপায় আছে:

irb(main):419:0> [2,4,6,3,8,6].delete_if{|i|i==6}
=> [2, 4, 3, 8]
irb(main):420:0>

" বেসিক অ্যারে অপারেশনস " কোথাও উল্লেখ করা হয়েছে , এর পরে এটি mapফাংশনটির উল্লেখ করে ।


তবে আপনি কেবল ব্যবহার করতে পারবেন না.delete(6)
— Zac

অবশ্যই @Zac কিন্তু যে উত্তর ইতিমধ্যে উল্লিখিত হয়েছে (যেমন খুব সংক্ষিপ্ত হয়ে গেছে -=পথ a-=[4]অর্থাত a=a-[4]। [3,4]-[4], যা আমি বললাম আমি পছন্দ করেছে), কিন্তু আমি অন্য সম্ভাব্য উপায়ে উল্লেখ করতে চেয়েছিলেন।
— বারলপ

এই পদ্ধতিতে মুছে ফেলা উপাদানটির পরিবর্তে অ্যারে ফিরিয়ে দেওয়ার সুবিধাও রয়েছে।
— এফ.ওয়েবার



15

এখানে কয়েকটি মানদণ্ড দেওয়া হল:

require 'fruity'


class Array          
  def rodrigo_except(*values)
    self - values
  end    

  def niels_except value
    value = value.kind_of?(Array) ? value : [value]
    self - value
  end
end

ARY = [2,4,6,3,8]

compare do
  soziev  { a = ARY.dup; a.delete(3);               a }
  steve   { a = ARY.dup; a -= [3];                  a }
  barlop  { a = ARY.dup; a.delete_if{ |i| i == 3 }; a }
  rodrigo { a = ARY.dup; a.rodrigo_except(3);         }
  niels   { a = ARY.dup; a.niels_except(3);           }
end

# >> Running each test 4096 times. Test will take about 2 seconds.
# >> soziev is similar to barlop
# >> barlop is faster than steve by 2x ± 1.0
# >> steve is faster than rodrigo by 4x ± 1.0
# >> rodrigo is similar to niels

এবং আবার প্রচুর অনুলিপিযুক্ত একটি বড় অ্যারে সহ:

class Array          
  def rodrigo_except(*values)
    self - values
  end    

  def niels_except value
    value = value.kind_of?(Array) ? value : [value]
    self - value
  end
end

ARY = [2,4,6,3,8] * 1000

compare do
  soziev  { a = ARY.dup; a.delete(3);               a }
  steve   { a = ARY.dup; a -= [3];                  a }
  barlop  { a = ARY.dup; a.delete_if{ |i| i == 3 }; a }
  rodrigo { a = ARY.dup; a.rodrigo_except(3);         }
  niels   { a = ARY.dup; a.niels_except(3);           }
end

# >> Running each test 16 times. Test will take about 1 second.
# >> steve is faster than soziev by 30.000000000000004% ± 10.0%
# >> soziev is faster than barlop by 50.0% ± 10.0%
# >> barlop is faster than rodrigo by 3x ± 0.1
# >> rodrigo is similar to niels

আরও বেশি নকল সহ আরও বড়:

class Array          
  def rodrigo_except(*values)
    self - values
  end    

  def niels_except value
    value = value.kind_of?(Array) ? value : [value]
    self - value
  end
end

ARY = [2,4,6,3,8] * 100_000

compare do
  soziev  { a = ARY.dup; a.delete(3);               a }
  steve   { a = ARY.dup; a -= [3];                  a }
  barlop  { a = ARY.dup; a.delete_if{ |i| i == 3 }; a }
  rodrigo { a = ARY.dup; a.rodrigo_except(3);         }
  niels   { a = ARY.dup; a.niels_except(3);           }
end

# >> Running each test once. Test will take about 6 seconds.
# >> steve is similar to soziev
# >> soziev is faster than barlop by 2x ± 0.1
# >> barlop is faster than niels by 3x ± 1.0
# >> niels is similar to rodrigo

7
তো, এর মধ্যে সেরাটি কী? :)
— কারবি

8

আমি নীলস এর সমাধানটি উন্নত করেছি

class Array          
  def except(*values)
    self - values
  end    
end

এখন আপনি ব্যবহার করতে পারেন

[1, 2, 3, 4].except(3, 4) # return [1, 2]
[1, 2, 3, 4].except(4)    # return [1, 2, 3]

আপনার সমাধান irbকনসোলে কাজ করছে না2.2.1 :007 > [1, 2, 3, 4].except(3, 4) NoMethodError: undefined method except for [1, 2, 3, 4]:Array from (irb):7 from /usr/share/rvm/rubies/ruby-2.2.1/bin/irb:11:in <main>
— hgsongra

1
আইআরবিতে ঘোষণা করতে, আপনাকে অ্যারেতে পদ্ধতিটি যুক্ত করতে হবে class Array; def except(*values); self - values; end; end।
— সোয়ার্ডস্ট্রম

3

আপনি এটি বানর প্যাচ করতে পারেন। আমি কখনই বুঝতে পারি নি যে রুবির একটি exceptপদ্ধতি আছে Hashতবে এর জন্য নয় Array:

class Array
  def except value
    value = value.kind_of(Array) ? value : [value]
    self - value
  end
end

এখন আপনি এটি করতে পারেন:

[1,3,7,"436",354,nil].except(354) #=> [1,3,7,"436",nil]

বা:

[1,3,7,"436",354,nil].except([354, 1]) #=> [3,7,"436",nil]

1
আপনার value.kind_of(Array)পরীক্ষার দরকার নেই । শুধু ব্যবহার self - Array(value)।
— সাসগোরিলা

3

সুতরাং যখন আপনার 3 টির একাধিক উপস্থিতি রয়েছে এবং আপনি কেবল 3 এর প্রথম উপস্থিতি মুছতে চান, আপনি কেবল নীচের মত কিছু করতে পারেন।

arr = [2, 4, 6, 3, 8, 10, 3, 12]

arr.delete_at arr.index 3

#This will modify arr as [2, 4, 6, 8, 10, 3, 12] where first occurrence of 3 is deleted. Returns the element deleted. In this case => 3.

3

প্রথম ঘটনাটি অ-ধ্বংসাত্মক অপসারণ:

a = [2, 4, 6, 3, 8]
n = a.index 3
a.take(n)+a.drop(n+1)

2

আপনি যদি এই মুছে ফেলা অপারেশনটিকে শৃঙ্খলাবদ্ধ করতে চান তবে আপনি কিছু আইটেম মুছতে পারেন এবং ফলাফলের অ্যারেতে চেইন ক্রিয়াকলাপ চালিয়ে যেতে পারেন tap: ব্যবহার করুন :

[2, 4, 6, 3, 8].tap { |ary| ary.delete(3) }.count #=> 4

1

রুবি মুছে ফেলার জন্য বিভিন্ন অপশন সংকলন

মুছুন - মান অনুসারে মিলে যাওয়া উপাদানগুলি মুছুন । যদি একের বেশি মান মেলে তবে এটি সমস্ত সরিয়ে ফেলবে। আপনি যদি সংঘটন সংখ্যা বা একক ঘটনার বিষয়ে নিশ্চিত না হন তবে এই পদ্ধতিটি ব্যবহার করুন।

a = [2, 6, 3, 5, 3, 7]
a.delete(3)  # returns 3
puts a       # return [2, 6, 5, 7]

delete_at - প্রদত্ত সূচকে উপাদান মুছুন । আপনি যদি সূচকে জানেন তবে এই পদ্ধতিটি ব্যবহার করুন।

# continuing from the above example
a.delete_at(2) # returns 5
puts a         # returns [2, 6, 7]

delete_if - প্রতিটি উপাদান মুছে ফেলা হয় যার জন্য ব্লকটি সত্য। এটি অ্যারে সংশোধন করবে। ব্লক ডাকার সাথে সাথে অ্যারে তত্ক্ষণাত পরিবর্তন হয়।

b = [1, 2, 5, 4, 9, 10, 11]
b.delete_if {|n| n >= 10}.  # returns [1, 2, 5, 4, 9]

প্রত্যাখ্যান করুন - এটি সেই উপাদানগুলির সাথে নতুন অ্যারে ফিরিয়ে দেবে যার জন্য প্রদত্ত ব্লকটি মিথ্যা। ক্রমটি এটি দিয়ে বজায় থাকে।

c = [1, 2, 5, 4, 9, 10, 11]
c.reject {|n| n >= 10}.  # returns [1, 2, 5, 4, 9]

প্রত্যাখ্যান! - মুছুন_আইফের মতো । ব্লক ডাকার সাথে সাথে অ্যারে তত্ক্ষণাত পরিবর্তন হতে পারে না।

আপনি যদি অ্যারে থেকে একাধিক মান মুছতে চান তবে সর্বোত্তম বিকল্পটি হ'ল নমুনা।

a = [2, 3, 7, 4, 6, 21, 13]
b = [7, 21]
a = a - b    # a - [2, 3, 4, 6, 13]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.