This page is READ-ONLY. It is generated from the old site.
All timestamps are relative to 2013 (when this page is generated).
If you are looking for TeX support, please go to VietTUG.org

pslit: phân hoạch mảng: phiên bản cải tiến

phân hoạch một mảng
Added by almost 3 years ago  »  Votes: 2/2

Trong bài (blog) trùng địa chỉ. gán song song, có đề cập tới hàm pslit để tách một mảng cho trước ra hai phần, một phần có chứa chuỗi pat và phần còn lại không chứa chuỗi pat. Trong bài này, ta giới thiệu phiên bản cải tiến của pslit, cho phép phân hoạch (chia) một mảng ra nhiều phần khác nhau.

Đầu vào của hàm pslit là một mảng các chuỗi làm tiêu chí phân hoạch. Đầu vào có thể là một chuỗi và khi đó, hàm sẽ tự nhận biết để chuyển đổi thành mảng. Hàm sẽ hoạt động theo nguyên tắc first match wins: tiêu chí phân hoạch đầu tiên sẽ thắng các tiêu chí đi sau trong việc tách ra các phần tử tử mảng gốc. Kết quả trả về của hàm là một Hash (tự điển) mà khóa là các tiêu chí phân loại. Ngoài ra còn có phần gồm tất cả các phần tử không thỏa tiêu chí nào, gọi là :remained.

Dưới đây là một ví dụ về cách dùng

 1 arr   = ["some_thing", "some_one", "man", "woman", "abc", :foobar, "some_man"]
 2 part  = arr.pslit(%w{some man})
 3              # tách mảng thành 3 phần:
 4              # - phần chứa chuỗi 'some' (tiêu chí 1)
 5              # - phần chứa chuỗi 'man'  (tiêu chí 2)
 6              # - và phần còn lại        (không thỏa 2 tiêu chí trên)
 7 puts part.inspect 
 8 # kết quả
 9 part {
10   "some" => ["some_thing", "some_one", "some_man"],
11   "man"  => ["man", "woman"],
12   :remained => ["abc", :foobar]
13 }

Mã của hàm pslit. Có thể cải tiến dễ dàng để có thể hỗ trợ tiêu chí là biểu thức chính quy.

 1 class Array
 2   def pslit(pat = [])
 3     ret = {}
 4     pat = [] if pat.nil?
 5     pat = [pat] unless pat.is_a?(Array)
 6     self.each do |item|
 7       if a = pat.detect{|p| item.include?(p)}
 8         ret[a] ||= []
 9         ret[a] << item
10       end
11     end
12     ret[:remained] = self.select{|item| !ret.map{|k,v| v}.flatten.include?(item)}
13     ret
14   end
15 end

Comments