Thao tác trên tập hợp (collection) Một số kỹ thuật xử lý trên tập hợp.

Một phần của tài liệu THỰC HÀNH NGÔN NGỮ LẬP TRÌNH (Trang 85 - 88)

Smalltalk cung cấp một số phương thức viết sẳn để xử lý tập hợp khá hữu hiệu. Các tập hợp là các lớp được dẫn xuất từ lớp Collection, trong đó quan trọng là các lớp Array và

String, là các lớp được thừa kế từ lớp IndexedCollection, nghĩa là các dạng tập hợp mà các phần tử có thể sắp xếp theo chỉ số.

Lưu ý là ta không thể thêm (gửi thông điệp add) một phần tử vào cho một đối tượng thuộc lớp Array hay lớp String (tổng quát là lớp FixedSizeCollection).

Một số kỹ thuật lập trình căn bản để xử lý tập hợp trên Smalltalk . Truy xuất trên tập hợp có chỉ số.

Để truy xuất đến một phần tử của tập hợp qua chỉ số, sử dụng phương thức at:, có đối số là một số nguyên bằng với chỉ số.

Ví dụ:

#(2 3 4) at: 2 Æ 2 ‘abcd’ at: 4 Æ $d

Để thay đổi giá trị một phần tử của tập hợp, ta dùng phương thức at:put: có hai thông số là số nguyên chỉ ra giá trị của chỉ số và một đối tượng bất kỳ tương ứng với giá trị cần thay đổi.

Ví dụ: |a|

a:= #($a #(2 3) ‘abc’). a at:2 put: 4.

^a

Kết quả sẽ là #( $a 4 'abc')

. Tạo một danh sách các số nguyên liên tiếp

Để tạo một danh sách các số nguyên liên tiếp có giá trị từ m đến n, sử dụng phương thức to: với đối tượng nhận thông điệp là m, đối số là n.

Ví dụ:

1 to: 4 Æ #(1 2 3 4)

Xem thêm phương thức to:by:

. Phương thức includes:

Phương thức này kiểm tra xem một phần tử nào đó có thuộc tập hợp hay không. Ví dụ:

#(2 3 4) includes: 2 Æ true #(2 3 4) includes: 5 Æ false . Phương thức do:

Phương thức này nhận đối số là một Context có đối số n, n sẽ lần lượt nhận giá trị là các phần tử của đối tượng nhận thông điệp và thực hiện nội dung của Context.

|a| a:= 0.

‘abcd’ do: [:i| a := a + i asciiValue]. ^a

Kết quả là 394 (tổng mã ascii của bốn ký tự $a, $b, $c, $d) . Phương thức select: reject:

Phương thức select: nhận đối số là một Context có đối số n, n sẽ lần lượt nhận giá trị là các phần tử của đối tượng nhận thông điệp và tạo ra một Collection mới cùng lớp với đối tượng nhận thông điệp bằng cách lựa chọn những phần tử nào khiến cho giá trị của Context là true.

Ví dụ:

#(2 3 4 5 6) select: [:i| i odd]

Kết quả trả về là #(3 5) (nội dung Context yêu cầu lựa chọn các phần tử có giá trị lẻ) Phương thức reject làm công việc ngược với select:

Ví dụ:

#(2 3 4 5 6) reject: [:i| i odd]

Kết quả sẽ là #(2 4 6) (nội dung yêu cầu loại bỏ các phần tử có giá trị lẻ) .Phương thức collect:

Phương thức này nhận đối số là một Context có đối số n, n sẽ lần lượt nhận giá trị là các phần tử của đối tượng nhận thông điệp và tạo ra một Collection mới cùng lớp với đối tượng nhận thông điệp bằng cách tạo ra các phần tử có giá trị lần lượt bằng với giá trị của n sau khi thực hiện xong nội dung Context

Ví dụ:

#($a $b $c $d) collect: [:i| i:= i asciiValue] Kết quả sẽ là #( 97 98 99 100)

Khi sử dụng đúng lúc các phương thức trên, các công việc xử lý trên tập hợp sẽ nhẹ nhàng và hiệu quả hơn là việc sử dụng các cấu trúc điều khiển lặp.

Ví dụ: hãy tạo một danh sách a bao gồm các phần tử chung giữa hai danh sách số nguyên a2 và a3

Công việc tạo phần tử chung giữa hai danh sách có thể xử lý trên một dòng lệnh như kịch bản sau:

|a a2 a3|

a2 := #(1 2 3 4 5 6). a3:= #( 2 4 6 8).

a:= a2 select: [:i| a3 includes: i]. ^ a

Một phần của tài liệu THỰC HÀNH NGÔN NGỮ LẬP TRÌNH (Trang 85 - 88)