đếm so với chiều dài so với kích thước trong bộ sưu tập


167

Từ việc sử dụng một số ngôn ngữ lập trình và thư viện, tôi đã nhận thấy các thuật ngữ khác nhau được sử dụng cho tổng số phần tử trong một bộ sưu tập.

Phổ biến nhất dường như là length, countsize.

ví dụ.

array.length
vector.size()
collection.count

Có bất kỳ thuật ngữ ưa thích được sử dụng? Có phụ thuộc vào loại bộ sưu tập không? I E. đột biến / bất biến

Có một ưu tiên cho nó là một tài sản thay vì một phương pháp?


Và có List.Capacitytài sản trong C #.
RBT

Tôi hy vọng các ngôn ngữ mới sẽ tránh các điều khoản mơ hồ.
Nikolay Klimchuk

Câu trả lời:


231

Length() có xu hướng đề cập đến các yếu tố tiếp giáp - một chuỗi có độ dài chẳng hạn.

Count() có xu hướng đề cập đến số lượng các yếu tố trong một bộ sưu tập lỏng lẻo.

Size() có xu hướng đề cập đến kích thước của bộ sưu tập, thường thì điều này có thể khác với độ dài trong các trường hợp như vectơ (hoặc chuỗi), có thể có 10 ký tự trong một chuỗi, nhưng lưu trữ được dành cho 20. Nó cũng có thể đề cập đến số các yếu tố - kiểm tra nguồn / tài liệu.

Capacity()- được sử dụng để đề cập cụ thể đến không gian được phân bổ trong bộ sưu tập và không phải là số phần tử hợp lệ trong đó. Nếu loại có cả "dung lượng" và "kích thước" được xác định thì "kích thước" thường chỉ số lượng phần tử thực tế.

Tôi nghĩ rằng điểm chính thuộc về ngôn ngữ và thành ngữ của con người, kích thước của một chuỗi dường như không rõ ràng, trong khi độ dài của một bộ cũng khó hiểu như nhau mặc dù chúng có thể được sử dụng để chỉ cùng một thứ (số phần tử ) trong một bộ sưu tập dữ liệu.


5
Vậy "bộ sưu tập lỏng lẻo" là gì? Tôi không thấy sự khác biệt giữa kích thước và tính ở đây.
Sophie Alpert

32
@ben: size = slot có sẵn, tính = yếu tố thực tế. kích thước == tính khi bộ sưu tập đầy.
Steven Evers

8
Downvoting vì size()đề cập đến số phần tử trong vector, khôngcapacity()... ít nhất là trong C ++, mà tôi nghĩ là người khởi của vectors với sizes.
Dave Abrahams

10
@DaveAbrahams - Tôi chưa bao giờ nói đó là trường hợp. Đọc lại lần nữa. Tôi nói nó "có xu hướng tham khảo", tôi thậm chí không bao giờ cố gắng đưa ra một tuyên bố cụ thể áp dụng như nhau cho tất cả các hoán vị của tất cả các lớp sưu tập trong tất cả các ngôn ngữ.
gbjbaanb

2
@SnOrfus Tôi nghĩ bạn đã đi vào cõi "năng lực" ở đó. std::vector(C ++) ví dụ sử dụng "dung lượng" và "kích thước" trong đó bạn sử dụng "kích thước" và "đếm" tương ứng. Trên thực tế, mọi thứ trong std::sử dụng "kích thước" cho số phần tử hiện tại, thậm chí std::string(cung cấp "kích thước" cho khả năng tương thích mẫu và "độ dài" hoàn toàn giống hệt nhau để ... thuận tiện cho con người tôi đoán).
Jason C

28

FWIW (và gần như không có gì), tôi thích 'Count' vì dường như nó chỉ ra rằng nó sẽ trả về số lượng phần tử / vật phẩm trong bộ sưu tập khá rõ ràng.

Khi phải đối mặt với các điều khoản 'Độ dài' hoặc 'Kích thước', tôi thường băn khoăn một lúc (hoặc thậm chí bị buộc phải đọc lại tài liệu) liệu điều chết tiệt đó sẽ cho tôi biết có bao nhiêu yếu tố trong phần chọn hoặc làm thế nào nhiều byte bộ sưu tập đang tiêu thụ. Điều này đặc biệt đúng đối với các bộ sưu tập được dự định là dự phòng như mảng hoặc chuỗi.

Nhưng không ai chịu trách nhiệm về các quy ước đặt tên được sử dụng bởi các thư viện / khung công tác tiêu chuẩn Java, BCL / .Net hoặc C / C ++ để hỏi tôi, vì vậy bạn hoàn toàn bế tắc với bất cứ điều gì họ nghĩ ra.

Giá như tôi thông minh hơn tôi nhiều và được đặt tên là Bjarne, tất cả các bạn có thể sẽ thoát khỏi sự khốn khổ ...

Tất nhiên, trở lại thế giới thực, bạn nên cố gắng tuân theo bất kỳ quy ước đặt tên nào được sử dụng bởi ngôn ngữ / nền tảng bạn đang sử dụng (ví dụ: size()trong C ++). Không phải điều này dường như giúp bạn với Array.Lengthtình trạng khó xử của bạn .


16
Mặc dù Độ dài và Kích thước là danh từ, Count cũng là một động từ, do đó nó có thể được hiểu là đếm khi chạy (O (n)) so với tra cứu một giá trị (O (1)).
mbx

Thật vậy, đó chính xác là cách nó được sử dụng trong LINQ: Enumerable.Count
Edward Brey

11

Các điều khoản có phần thay thế cho nhau, mặc dù trong một số tình huống tôi sẽ thích cái này hơn cái khác. Thông thường bạn có thể có được cách sử dụng tốt nhất nếu bạn nghĩ về Làm thế nào bạn sẽ mô tả chiều dài / kích thước / số lượng của yếu tố này bằng lời nói với người khác?

length()ngụ ý rằng phần tử có chiều dài. Một chuỗi có độ dài. Bạn nói "một chuỗi dài 20 ký tự", phải không? Vì vậy, nó có một chiều dài.

size()ngụ ý rằng phần tử có kích thước. Ví dụ: một tập tin có kích thước. Bạn nói "tập tin này có kích thước 2 MB", phải không? Vì vậy, nó có một kích thước.

Điều đó nói rằng, một chuỗi cũng có thể có kích thước, nhưng tôi mong đợi một cái gì đó khác ở đây. Ví dụ: chuỗi UTF-16 có thể có độ dài 100 ký tự, nhưng vì mỗi ký tự được tạo thành từ hai byte, tôi mong muốn kích thước là 200.

count()là rất bất thường. Objective-C sử dụng số lượng cho số phần tử trong một mảng. Người ta có thể tranh luận nếu một mảng có độ dài (như trong Java), có kích thước (như trong hầu hết các ngôn ngữ khác) hoặc có số đếm. Tuy nhiên, kích thước có thể lại là kích thước tính theo byte (nếu các mục mảng là int 32 bit, mỗi mục là 4 byte) và chiều dài ... Tôi sẽ không nói "một mảng dài 20 phần tử", nghe có vẻ khá kỳ lạ với tôi. Tôi muốn nói "một mảng có 20 phần tử". Tôi không chắc liệu số đếm có thể hiện điều đó rất tốt hay không, nhưng tôi nghĩ rằng số đếm ở đây là một dạng ngắn elementCount()và điều đó lại có ý nghĩa hơn đối với một mảng so với chiều dài () hoặc kích thước ().

Nếu bạn tạo các đối tượng / thành phần riêng trong ngôn ngữ lập trình, tốt nhất nên sử dụng bất kỳ yếu tố tương tự nào khác sử dụng, vì các lập trình viên được sử dụng để truy cập thuộc tính mong muốn bằng thuật ngữ đó.


Theo chuỗi tương tự của bạn, một tệp phải có một length, nhưng các kho khác nhau có thể sử dụng khác nhau sizesđể lưu trữ dữ liệu của nó. Java cũng nghĩ như vậy trong java.io.File # length () , nhưng có vẻ như phần còn lại của thế giới không đồng ý.
Ivan Balashov

1
@IvanBalashov Tôi chưa bao giờ sử dụng "độ dài của tệp" trong cuộc nói chuyện hàng ngày, đối với tôi, một tệp không có độ dài nhưng kích thước và đó cũng là những gì tôi đã viết trong bài trả lời của mình. Bất cứ khi nào chúng ta đang nói về byte thô, chúng ta đang nói về kích thước IMHO và một tệp không có nội dung cụ thể gần hơn chỉ là một bó byte. Độ dài thường không được sử dụng để biểu thị số byte nhưng để thể hiện sự tích lũy của các phần tử được xâu chuỗi lại với nhau (byte không phải là phần tử với tôi, hơn nữa các khối xây dựng để tạo thành các phần tử và chúng cũng không được "xâu chuỗi lại với nhau").
Mecki

4

Đếm tôi nghĩ là thuật ngữ rõ ràng nhất để sử dụng nếu bạn đang tìm kiếm số lượng vật phẩm trong một bộ sưu tập. Điều đó thậm chí còn rõ ràng đối với các lập trình viên mới, những người chưa trở nên đặc biệt gắn bó với một ngôn ngữ nhất định.

Và nó phải là một tài sản như nó là: một mô tả (còn gọi là tài sản) của bộ sưu tập. Một phương pháp sẽ ngụ ý rằng nó phải làm một cái gì đó cho bộ sưu tập để có được số lượng vật phẩm và điều đó dường như không trực quan.


3

Hmm ... Tôi sẽ không sử dụng kích thước. Bởi vì điều này có thể bị nhầm lẫn với kích thước tính bằng byte. Độ dài - có thể có ý nghĩa đối với các mảng, miễn là chúng được sử dụng các byte bộ nhớ. Mặc dù ... chiều dài ... trong những gì? Đếm là rõ ràng. Có bao nhiêu yếu tố. Tôi sẽ sử dụng đếm.

Về thuộc tính / phương thức, tôi sẽ sử dụng thuộc tính để đánh dấu nhanh và phương thức đánh dấu chậm.

Và, điều quan trọng nhất - tôi sẽ tuân theo các tiêu chuẩn của ngôn ngữ / thư viện bạn đang sử dụng.


Vậy còn DataBlock thì sao, chỉ là một bó byte. Nó có chiều dài hay nó có kích thước?
Mecki

2

Thêm vào câu trả lời của @ gbjbaanb ...

Nếu "tài sản" ngụ ý truy cập công khai vào giá trị, tôi sẽ nói rằng "phương thức" được ưu tiên chỉ đơn giản là cung cấp đóng gói và để ẩn việc thực hiện.

Bạn có thể thay đổi suy nghĩ về cách countcác yếu tố hoặc cách bạn duy trì điều đó count. Nếu đó là một tài sản, bạn bị mắc kẹt - nếu nó được thông qua một phương thức, bạn có thể thay đổi việc triển khai cơ bản mà không ảnh hưởng đến người dùng của bộ sưu tập.


Tại sao bạn bị "mắc kẹt" nếu nó được tiếp xúc như một tài sản? Các thuộc tính có một triển khai cơ bản có thể thay đổi dễ dàng mà không làm hỏng giao diện. Trong thực tế, hầu hết các ngôn ngữ đều triển khai các thuộc tính như trình biên dịch tạo các phương thức get / set ... bạn không thể gọi chúng trực tiếp.
Scott Dorman

"Hầu hết các ngôn ngữ" mà bạn đang đề cập đến? C, C ++, Java (chỉ kể tên một vài) không làm điều này. Ruby và Groovy tôi biết làm. Xin lưu ý cách tôi cũng bắt đầu câu trả lời: "Nếu" tài sản "ngụ ý ..." Tại sao bị mắc kẹt? Nếu giao diện của lớp thay đổi, khách hàng phải thay đổi (nói chung)
Ken Gentle

1

Trong Elixir thực sự có một sơ đồ đặt tên rõ ràng được liên kết với nó qua các loại trong ngôn ngữ.

Khi tính toán số lượng các phần tử trong cấu trúc dữ liệu, Elixir cũng tuân theo một quy tắc đơn giản: hàm được đặt tên sizenếu hoạt động trong thời gian không đổi (nghĩa là giá trị được tính toán trước) hoặc lengthnếu hoạt động là tuyến tính (nghĩa là tính toán chiều dài trở nên chậm hơn khi đầu vào phát triển).


0

Đối với tôi, điều này giống như hỏi "foreach" có tốt hơn "cho mỗi" không. Nó chỉ phụ thuộc vào ngôn ngữ / khung.


Và, nó có vấn đề gì? Các thay đổi? Có phải tất cả chúng ta sẽ viết email tức giận cho những người Java để chọn hai và không nhất quán?
S.Lott

1
Đó là quan điểm của tôi. Tại sao tự hỏi cái nào tốt hơn. Đó là những gì nó được.
EBGreen

0

Tôi muốn nói rằng nó phụ thuộc vào ngôn ngữ cụ thể mà bạn đang sử dụng và các lớp . Ví dụ: trong c # nếu bạn đang sử dụng Mảng bạn có Độ dài thuộc tính , nếu bạn có thứ gì đó kế thừa từ IEnumerable, bạn có phần mở rộng Phương thức Count (), nhưng nó không nhanh. Và nếu bạn được thừa kế từ ICollection, bạn có Số lượng tài sản .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.