hitung vs panjang vs ukuran dalam koleksi

167

Dari menggunakan sejumlah bahasa pemrograman dan pustaka, saya telah memperhatikan berbagai istilah yang digunakan untuk jumlah total elemen dalam koleksi.

Yang paling umum tampaknya length, count, dan size.

misalnya.

array.length
vector.size()
collection.count

Apakah ada istilah yang disukai untuk digunakan? Apakah itu tergantung pada jenis koleksi apa itu? yaitu. bisa berubah / tidak berubah

Apakah ada preferensi untuk menjadi properti alih-alih metode?

gula tetes
sumber
Dan ada List.Capacityproperti juga di C #.
RBT
Saya berharap bahasa baru akan menghindari istilah yang ambigu.
Nikolay Klimchuk

Jawaban:

231

Length() cenderung merujuk ke elemen yang berdekatan - string memiliki panjang misalnya.

Count() cenderung merujuk pada jumlah elemen dalam koleksi yang lebih longgar.

Size() cenderung merujuk pada ukuran koleksi, sering kali ini dapat berbeda dari panjang dalam kasus-kasus seperti vektor (atau string), mungkin ada 10 karakter dalam sebuah string, tetapi penyimpanan dicadangkan untuk 20. Ini juga dapat merujuk pada jumlah elemen - periksa sumber / dokumentasi.

Capacity()- Digunakan untuk merujuk secara khusus ruang yang dialokasikan dalam koleksi dan bukan jumlah elemen yang valid di dalamnya. Jika tipe memiliki "kapasitas" dan "ukuran" yang ditentukan maka "ukuran" biasanya merujuk pada jumlah elemen yang sebenarnya.

Saya pikir intinya adalah ke bahasa manusia dan idiom, ukuran string tidak tampak terlalu jelas, sementara panjang satu set sama membingungkan meskipun mereka dapat digunakan untuk merujuk pada hal yang sama (jumlah elemen ) dalam kumpulan data.

gbjbaanb
sumber
5
Jadi, apa itu "koleksi yang lebih longgar"? Saya tidak melihat perbedaan antara ukuran dan jumlah di sini.
Sophie Alpert
32
@ben: size = slot yang tersedia, count = elemen aktual. size == menghitung ketika koleksi sudah penuh.
Steven Evers
8
Downvoting karena size()mengacu pada jumlah elemen dalam vektor, tidak nya capacity()... setidaknya dalam C ++, yang saya pikir adalah pencetus vectors dengan sizes.
Dave Abrahams
10
@DaveAbrahams - Saya tidak pernah mengatakan itu masalahnya. Baca lagi. Saya mengatakannya "cenderung merujuk", saya bahkan tidak pernah mencoba membuat pernyataan spesifik yang diterapkan secara merata ke semua permutasi semua kelas koleksi dalam semua bahasa.
gbjbaanb
2
@SnOrfus Saya pikir Anda telah pergi ke ranah "kapasitas" di sana. std::vector(C ++) misalnya menggunakan "kapasitas" dan "ukuran" di mana Anda menggunakan "ukuran" dan "menghitung", masing-masing. Sebenarnya, semua yang di std::gunakan "ukuran" untuk jumlah elemen saat ini, bahkan std::string(yang menyediakan "ukuran" untuk kompatibilitas template dan "panjang" yang sama sekali identik untuk ... kenyamanan manusia kurasa).
Jason C
28

FWIW (dan itu hampir tidak ada artinya), saya lebih suka 'Count' karena sepertinya mengindikasikan bahwa itu akan mengembalikan jumlah elemen / item dalam koleksi dengan sangat jelas.

Ketika dihadapkan dengan istilah 'Panjang' atau 'Ukuran', saya sering bertanya-tanya sejenak (atau bahkan dipaksa membaca ulang dokumentasi) apakah benda itu akan memberi tahu saya berapa banyak elemen yang ada dalam koleksi atau bagaimana banyak byte yang dikonsumsi oleh koleksi. Ini terutama berlaku untuk koleksi yang dimaksudkan untuk bersifat kontingensi seperti array atau string.

Tapi tidak ada orang yang bertanggung jawab atas konvensi penamaan yang digunakan oleh Java, BCL / .Net, atau C / C ++ kerangka kerja standar / perpustakaan yang bertanya kepada saya, jadi Anda semua terjebak dengan apa pun yang muncul.

Kalau saja saya jauh lebih pintar dari saya dan bernama Bjarne, kalian semua bisa terhindar dari kesengsaraan ...

Tentu saja, kembali ke dunia nyata, Anda harus mencoba untuk tetap menggunakan konvensi penamaan apa pun yang digunakan oleh bahasa / platform yang Anda gunakan (mis., size()Dalam C ++). Bukannya ini sepertinya membantu Anda dengan Array.Lengthdilema Anda .

Michael Burr
sumber
16
Sementara Panjang dan Ukuran adalah kata benda, Hitung juga kata kerja, sehingga dapat diartikan sebagai penghitungan saat runtime (O (n)) vs nilai pencarian (O (1)).
mbx
Memang, itulah yang digunakan di LINQ: Enumerable.Count
Edward Brey
11

Istilahnya agak bergantian, meskipun dalam beberapa situasi saya lebih suka satu sama lain. Biasanya Anda bisa mendapatkan penggunaan terbaik jika Anda berpikir tentang Bagaimana Anda menggambarkan panjang / ukuran / jumlah elemen ini secara verbal kepada orang lain?

length()menyiratkan bahwa elemen memiliki panjang. Sebuah string memiliki panjang. Anda mengatakan "string panjangnya 20 karakter", kan? Jadi panjangnya.

size()menyiratkan bahwa elemen memiliki ukuran. Misalnya file memiliki ukuran. Anda mengatakan "file ini memiliki ukuran 2 MB", kan? Jadi ada ukurannya.

Yang mengatakan, string juga dapat memiliki ukuran, tetapi saya akan mengharapkan sesuatu yang lain di sini. Misalnya string UTF-16 mungkin memiliki panjang 100 karakter, tetapi karena setiap karakter terdiri dari dua byte, saya berharap ukurannya menjadi 200.

count()sangat tidak biasa. Objective-C menggunakan count untuk jumlah elemen dalam array. Orang mungkin berdebat jika array memiliki panjang (seperti di Jawa), memiliki ukuran (seperti dalam kebanyakan bahasa lain) atau memiliki hitungan. Namun, ukuran mungkin lagi menjadi ukuran dalam byte (jika item array adalah 32 bit int, setiap item adalah 4 byte) dan panjangnya ... Saya tidak akan mengatakan "sebuah array adalah 20 elemen panjang", yang terdengar agak aneh untuk saya. Saya akan mengatakan "sebuah array memiliki 20 elemen". Saya tidak yakin apakah hitung mengekspresikan dengan sangat baik, tetapi saya pikir hitung di sini adalah bentuk singkat untuk elementCount()dan itu lagi jauh lebih masuk akal untuk array daripada panjang () atau ukuran ().

Jika Anda membuat objek / elemen sendiri dalam bahasa pemrograman, sebaiknya gunakan apa pun yang menggunakan elemen serupa lainnya, karena programmer digunakan untuk mengakses properti yang diinginkan menggunakan istilah itu.

Mecki
sumber
Mengikuti analogi string Anda, file harus memiliki length, tetapi penyimpanan yang berbeda mungkin menggunakan yang berbeda sizesuntuk menyimpan datanya. Java juga berpikir demikian dalam java.io.File # length () , tetapi sepertinya seluruh dunia tidak setuju.
Ivan Balashov
1
@IvanBalashov Saya tidak pernah menggunakan "panjang file" dalam pembicaraan sehari-hari, bagi saya file tidak memiliki panjang tetapi ukuran dan itu juga yang saya tulis dalam balasan saya. Setiap kali kita berbicara tentang byte mentah, kita berbicara tentang ukuran IMHO dan file tanpa konten spesifik yang lebih dekat hanyalah sekelompok byte. Panjang biasanya tidak digunakan untuk mengekspresikan jumlah byte tetapi untuk mengekspresikan akumulasi elemen yang dirangkai bersama (byte bukan elemen bagi saya, lebih banyak blok bangunan untuk membentuk elemen dan mereka juga tidak "dirangkai bersama").
Mecki
4

Hitungan Saya pikir adalah istilah yang paling jelas untuk digunakan jika Anda mencari jumlah item dalam koleksi. Itu bahkan harus jelas bagi pemrogram baru yang belum terlalu melekat pada bahasa yang diberikan.

Dan itu harus berupa properti seperti itu: deskripsi (alias properti) dari koleksi. Sebuah metode akan menyiratkan bahwa ia harus melakukan sesuatu pada koleksi untuk mendapatkan jumlah item dan itu sepertinya tidak intuitif.

Corin
sumber
3

Hmm ... saya tidak akan menggunakan ukuran. Karena ini mungkin dikacaukan dengan ukuran dalam byte. Panjang - bisa masuk akal untuk array, selama mereka seharusnya menggunakan byte memori yang konsekuen. Meskipun ... panjang ... dalam apa? Hitungannya jelas. Berapa banyak elemen. Saya akan menggunakan hitungan.

Tentang properti / metode, saya akan menggunakan properti untuk menandai itu cepat, dan metode untuk menandai itu lambat.

Dan yang paling penting - saya akan tetap berpegang pada standar bahasa / perpustakaan yang Anda gunakan.

Paul Kapustin
sumber
Jadi bagaimana dengan DataBlock, hanya beberapa byte. Apakah memiliki panjang atau memiliki ukuran?
Mecki
2

Menambahkan ke jawaban @ gbjbaanb ...

Jika "properti" menyiratkan akses publik ke nilai, saya akan mengatakan bahwa "metode" lebih disukai hanya untuk menyediakan enkapsulasi dan untuk menyembunyikan implementasinya.

Anda mungkin berubah pikiran tentang cara countelemen atau cara mempertahankannya count. Jika ini adalah properti, Anda macet - jika diakses melalui metode, Anda dapat mengubah implementasi yang mendasarinya tanpa memengaruhi pengguna koleksi.

Ken Gentle
sumber
Mengapa Anda "mandek" jika terekspos sebagai properti? Properti memiliki implementasi mendasar yang dapat berubah dengan mudah tanpa merusak antarmuka. Bahkan, sebagian besar bahasa mengimplementasikan properti sebagai metode kompilasi yang dihasilkan get / set ... Anda tidak bisa memanggil mereka secara langsung.
Scott Dorman
"Bahasa apa" yang Anda maksud? C, C ++, Java (hanya untuk beberapa nama) jangan lakukan ini. Ruby dan Groovy saya tahu. Harap perhatikan bagaimana saya memulai jawabannya, juga: "Jika 'properti' menyiratkan ..." Mengapa macet? Jika antarmuka ke kelas berubah, klien harus berubah (secara umum)
Ken Gentle
1

Dalam Elixir sebenarnya ada skema penamaan yang jelas terkait dengan itu lintas tipe dalam bahasa.

Ketika "menghitung" jumlah elemen dalam struktur data, Elixir juga mematuhi aturan sederhana: fungsi tersebut dinamai sizejika operasi dalam waktu yang konstan (yaitu nilainya dihitung sebelumnya) atau lengthjika operasi linier (yaitu menghitung panjangnya menjadi lebih lambat saat input bertambah).

bola terang
sumber
0

Bagi saya, ini seperti bertanya apakah "pendahuluan" lebih baik daripada "untuk masing-masing". Itu hanya tergantung pada bahasa / kerangka kerja.

EBGreen
sumber
Dan apa masalahnya? Perubahan apa? Apakah kita semua akan menulis email marah kepada orang-orang Jawa untuk memilih dua dan menjadi tidak konsisten?
S.Lott
1
Itu poin saya. Mengapa bertanya-tanya mana yang lebih baik. Itu adalah apa adanya.
EBGreen
0

Saya akan mengatakan bahwa itu tergantung pada bahasa tertentu yang Anda gunakan dan kelas . Sebagai contoh di c # jika Anda menggunakan Array Anda memiliki Panjang Properti , jika Anda memiliki sesuatu yang mewarisi dari IEnumerable Anda memiliki ekstensi Metode Count (), tetapi itu tidak cepat. Dan jika Anda mewarisi dari ICollection Anda memiliki Hitung Properti .

Alexandr
sumber