2013-07-31 42 views
11

Làm cách nào để xóa một số phần tử khỏi một mảng và chọn chúng?Xóa khỏi mảng và trả về các phần tử đã xóa trong Ruby

Ví dụ:

class Foo 
    def initialize 
    @a = [1,2,3,4,5,6,7,8,9] 
    end 

    def get_a 
    return @a 
    end 
end 

foo = Foo.new 
b = foo.get_a.sth{ |e| e < 4 } 
p b # => [1,2,3] 
p foo.get_a # => [4,5,6,7,8,9,10] 

Những gì tôi có thể sử dụng thay vì foo.get_a.sth?

+0

Biến cá thể của bạn '@ a' trên lớp' Foo' không làm gì cả. Bạn nên loại bỏ nó. – sawa

+0

Câu hỏi được tóm tắt và chi tiết bị xóa. bạn có thể giả sử rằng dòng '@a = [1,2,3,4,5,6,7,8,9]' là kết quả của một quá trình nào đó. – NewMrd

+0

Tôi xin lỗi !! Tôi đã quen với mẫu java !!! : p – NewMrd

Trả lời

22

Nếu bạn không cần phải giữ lại các đối tượng id của a:

a = [1,2,3,4,5,6,7,8,9,10] 
b, a = a.partition{|e| e < 4} 
b # => [1, 2, 3] 
a # => [4, 5, 6, 7, 8, 9, 10] 

Nếu bạn cần phải giữ lại các đối tượng id của a, sau đó sử dụng một mảng thời c:

a = [1,2,3,4,5,6,7,8,9,10] 
b, c = a.partition{|e| e < 4} 
a.replace(c) 
+1

câu trả lời hay, nhưng tôi không thể thay đổi 'a'. 'a' là kết quả của hàm' some_object.get_some_array' – NewMrd

+0

@NewMrd Tại sao bạn không thể thay đổi nó? Biến là một biến, vì vậy bạn luôn có thể chỉ định một biến là kết quả của cuộc gọi đó, khi đó mẫu này hoạt động tốt. – tadman

+4

Bạn có thể không chỉ sử dụng 'a.select {| e | e <4} 'trong trường hợp đó? Điều này sẽ trả về các phần tử vượt qua bài kiểm tra. –

0
a = [1, 2, 3, 4] 
a.dup - (a.delete_if(&:even?)) 
#=> [2, 4] 

a 
#=> [1, 3] 

a = [1, 2, 3, 4] 
b = a.dup - (a.delete_if { |e| e < 4 }) 
a 
#=> [4] 
b 
#=> [1, 2, 3] 

Chỉnh sửa: Có vẻ như bạn chỉ sau #select ...

a = [1, 2, 3, 4] 
a.select { |e| e < 3 } 
#=> [1, 2] 
+0

Nếu có các phần tử trùng lặp thì khối sẽ trả về giống nhau cho cả hai phần tử, vì vậy đây không phải là vấn đề! –

+0

Bạn có thể cung cấp một ví dụ không? –

+1

Có thể tôi đã sai. Lấy làm tiếc. – sawa

1

Nếu bạn chỉ xóa một mục, điều này không cần sao chép các mảng, vv:

array = [{ id: 1 }, { id: 2 }, {id: 3 }] 
array.delete_at(array.find_index { |element| element[:id] == 1 }) 
#=> {:id=>1} 
+1

Đây là giải pháp hoàn hảo cho ứng dụng của tôi cho nhu cầu tương tự. – Jay

+0

điều này sẽ thất bại nếu find_index trả về nil – mountriv99

0

tôi vẫn không tin ruby ​​không có một cái gì đó cho điều này trong thư viện mặc định của nó. Nên có phương pháp #drop tương đương cho việc này. Chắc chắn có một viên đá quý có sẵn để thêm chức năng vào lớp mảng. Nhưng ai cần đá quý khi bạn chỉ có thể chia ra các tập lệnh của riêng bạn:

#in initializer somewhere 
class Array 
    def exclude(obj) 
    x = self 
    x.delete(obj) 
    x 
    end 
end 

Tôi có thể gửi yêu cầu kéo đến dự án gubub ruby ​​cho phương pháp này. Bản vá siêu nhân này hoạt động rất tốt cho đến nay.

Các vấn đề liên quan