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


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.