koleksiyondaki uzunluk ve boy vs sayma


167

Bir dizi programlama dili ve kitaplığı kullanarak, bir koleksiyondaki toplam öğe sayısı için kullanılan çeşitli terimleri fark ettim.

En yaygın görünmektedir length, countve size.

Örneğin.

array.length
vector.size()
collection.count

Kullanılacak tercih edilen bir terim var mı? Ne tür bir koleksiyon olduğuna bağlı mı? yani. değişken / değişmez

Bir yöntem yerine bir özellik olması tercih edilir mi?


Ve List.CapacityC # özelliği de var .
RBT

Umarım yeni diller belirsiz terimlerden kaçınır.
Nikolay Klimchuk

Yanıtlar:


231

Length() bitişik öğelere gönderme eğilimi gösterir - örneğin bir dizginin uzunluğu vardır.

Count() daha gevşek bir koleksiyondaki öğelerin sayısını ifade etme eğilimindedir.

Size() koleksiyonun boyutuna gönderme eğilimi gösterir, genellikle bu vektörler (veya dizeler) gibi durumlarda uzunluktan farklı olabilir, bir dizede 10 karakter olabilir, ancak depolama 20 için ayrılmıştır. elemanlar - kaynağı / belgeleri kontrol edin.

Capacity()- özel olarak koleksiyondaki ayrılan alanı ifade etmek için kullanılır, içindeki geçerli elemanların sayısını değil. Türde "kapasite" ve "boyut" tanımlıysa, "boyut" genellikle gerçek öğelerin sayısını ifade eder.

Bence asıl mesele insan diline ve deyimlere düşüyor, bir dizenin boyutu çok açık görünmüyor, bir setin uzunluğu da aynı şeye (öğe sayısı) atıfta bulunmakla birlikte eşit derecede kafa karıştırıcı ) bir veri koleksiyonunda.


5
Peki "gevşek koleksiyon" nedir? Burada boyut ve sayım arasındaki farkı görmüyorum.
Sophie Alpert

32
@ben: size = kullanılabilir yuvalar, sayım = gerçek öğeler. size == toplama dolu olduğunda say.
Steven Evers

8
Aşağı oylama size(), vektördeki elemanların sayısını ifade eder, onun değilcapacity() ... en azından C ++ 'da, vectors'nin s'nin yaratıcısı olduğunu düşünüyorum size.
Dave Abrahams

10
@DaveAbrahams - Asla böyle olduğunu söylemedim. Tekrar oku. Ben "başvurmak eğiliminde" dedim, asla tüm dillerdeki tüm toplama sınıflarının tüm permütasyonlarına eşit olarak uygulanan belirli bir ifade yapmaya çalışmadım.
gbjbaanb

2
@SnOrfus Sanırım orada "kapasite" alanına girdiniz. std::vector(C ++), sırasıyla "size" ve "count" kullandığınız yerlerde "kapasite" ve "size" kullanır. Aslında her şey içinde std::geçerli eleman sayısı bile için kullandığı "boyutu" std::string(şablon uyumluluk ve sanırım için ... insan kolaylık tamamen özdeş "uzunluk" için "boyutu" sağlar).
Jason C

28

FWIW (ve bu hiçbir şeyden yoksundur), 'Sayımı' tercih ederim çünkü koleksiyondaki elemanların / öğelerin sayısını oldukça net bir şekilde döndüreceğini gösteriyor.

'Uzunluk' veya 'Boyut' terimleriyle karşı karşıya kaldığımda, lanet şeyin bana koleksiyonda kaç öğenin olduğunu ya da nasıl olduğunu söyleyip söylemeyeceğini sık sık bir an merak ediyorum (ya da belgeleri yeniden okumak zorunda kalıyorum). koleksiyonun tükettiği bayt. Bu özellikle diziler veya dizgiler gibi olumsal olması amaçlanan koleksiyonlar için geçerlidir.

Ancak Java, BCL / .Net veya C / C ++ standart çerçeveleri / kütüphaneleri tarafından kullanılan adlandırma kurallarından sorumlu olan hiç kimse bana sormaya zahmet etmedi, bu yüzden hepiniz ne bulduklarına takılıp kaldınız.

Keşke benden çok daha akıllı olsaydım ve Bjarne olarak adlandırılsaydı, hepiniz sefaletten kurtulmuş olabilirsiniz ...

Tabii ki, gerçek dünyada, kullandığınız dil / platform tarafından kullanılan adlandırma kurallarına bağlı kalmaya çalışmalısınız (örneğin, size()C ++ ile). Bunun Array.Lengthikileminizde size yardımcı olduğu görülmüyor.


16
Uzunluk ve Boyut isimler olsa da, Count da bir fiildir, bu nedenle çalışma zamanında sayım (O (n)) ve arama değeri (O (1)) olarak sayılabilir.
mbx

Gerçekten de, LINQ: Enumerable.Count'ta
Edward Brey

11

Terimler bir şekilde birbirinin yerine geçebilir, ancak bazı durumlarda birini diğerine tercih ederim. Genellikle , bu öğenin uzunluğunu / boyutunu / sayısını sözlü olarak başka bir kişiye nasıl tarif edersiniz?

length()elemanın bir uzunluğa sahip olduğunu ima eder. Bir dizenin uzunluğu vardır. "Bir dize 20 karakter uzunluğunda" diyorsunuz, değil mi? Yani bir uzunluğu var.

size()öğenin bir boyutu olduğunu ima eder. Örneğin bir dosyanın boyutu vardır. "Bu dosyanın boyutu 2 MB" diyorsunuz, değil mi? Yani bir boyutu var.

Yani, bir dize de bir boyutu olabilir, ama burada başka bir şey beklenir dedi. Örneğin, UTF-16 dizesi 100 karakter uzunluğunda olabilir, ancak her karakter iki bayttan oluştuğundan, boyutun 200 olmasını beklerdim.

count()çok sıradışı. Objective-C, bir dizideki öğe sayısı için count kullanır. Bir dizinin uzunluğu (Java'da olduğu gibi), boyutu (diğer birçok dilde olduğu gibi) veya sayımı olup olmadığı iddia edilebilir. Bununla birlikte, boyut yine bayt cinsinden boyut olabilir (dizi öğeleri 32 bit int ise, her öğe 4 bayttır) ve uzunluk ... Ben bir dizi 20 eleman uzunluğunda olduğunu söyleyemem, bu oldukça garip geliyor ben mi. "Bir dizinin 20 öğesi var" diyebilirim. Count çok iyi ifade ederse emin değilim, ama sayısı burada kısa bir form olduğunu düşünüyorum elementCount()ve yine bir dizi için length () veya size () çok daha mantıklı.

Bir programlama dilinde kendi nesnelerini / öğelerini oluşturursanız, programcılar bu terimi kullanarak istenen özelliğe erişmek için kullanıldığından, benzer öğelerin kullandığı her şeyi kullanmak en iyisidir.


Dize benzetmenizden sonra bir dosyanın bir değeri olmalıdır length, ancak farklı depolar sizesverilerini depolamak için farklı depolar kullanabilir . Java da java.io.File # length () ' da böyle düşünüyor , ancak dünyanın geri kalanı aynı fikirde değil gibi görünüyor.
Ivan Balashov

1
@IvanBalashov Günlük konuşmada "dosya uzunluğunu" hiç kullanmadım, benim için bir dosyanın uzunluğu dışında bir boyutu var ve cevabımda yazdığım da bu. Ham baytlardan bahsederken, IMHO boyutundan bahsediyoruz ve daha yakın spesifik içeriğe sahip olmayan bir dosya sadece bir bayt bayt. Uzunluk genellikle bayt sayısını ifade etmek için değil, birlikte dizilmiş elemanların birikimini ifade etmek için kullanılır (baytlar benim için eleman değildir, elemanları oluşturmak için daha fazla yapı taşıdır ve aynı zamanda "birbirine bağlı değildir").
Mecki

4

Count Bir koleksiyondaki öğe sayısını arıyorsanız, en açık terim olduğunu düşünüyorum. Bu, henüz belirli bir dile özel olarak bağlanmamış yeni programcılar için bile açık olmalıdır.

Ve böyle bir özellik olmalı: koleksiyonun açıklaması (aka özellik). Bir yöntem, öğelerin sayısını elde etmek için koleksiyona bir şeyler yapması gerektiği anlamına gelir ve bu sadece sezgisel görünmez.


3

Hmm ... Boyut kullanmazdım. Çünkü bu bayt cinsinden boyut ile karıştırılabilir. Uzunluk - ardışık bellek baytlarını kullanmaları gerektiği sürece diziler için bir anlam ifade edebilir. Gerçi ... uzunluk ... ne içinde? Sayım açık. Kaç element. Kont kullanırım.

Mülk / yöntem hakkında, hızlı işaretlemek için özellik ve yavaş işaretlemek için yöntem kullanırdım.

Ve en önemlisi - kullandığınız dillerin / kütüphanelerin standartlarına bağlı kalırım.


Peki bir DataBlock, sadece bir bayt bayt. Uzunluğu mu yoksa boyutu var mı?
Mecki

2

@ Gbjbaanb'ın yanıtına ekleniyor ...

"Özellik" değere genel erişim anlamına geliyorsa, ben "yöntem" sadece kapsülleme sağlamak ve uygulamayı gizlemek için tercih söyleyebilirim.

countElemanların nasıl yapılacağı veya bunu nasıl koruduğunuz konusunda fikrinizi değiştirebilirsiniz count. Bir özellikse, sıkışmış olursunuz - bir yöntemle erişilirse, koleksiyonun kullanıcılarını etkilemeden temeldeki uygulamayı değiştirebilirsiniz.


Neden bir mülk olarak ifşa edildiyse "takıldınız"? Özellikler, arabirimi bozmadan kolayca değişebilen temel bir uygulamaya sahiptir. Aslında, çoğu dil özellikleri derleyici tarafından oluşturulan get / set yöntemleri olarak uygular ... bunları doğrudan çağıramazsınız.
Scott Dorman

Hangi "çoğu dilden" bahsediyorsunuz? C, C ++, Java (sadece birkaç isim) bunu yapmayın. Ruby ve Groovy biliyorum. Lütfen yanıtı nasıl başlattığımı da not edin: "Eğer 'mülk' ima ederse ..." Neden takıldım? Sınıfa arayüz değişirse, istemciler değişmelidir (genel olarak konuşur)
Ken Gentle

1

İksir'de aslında dilde türler arasında onunla ilişkili açık bir adlandırma düzeni vardır.

Bir veri yapısındaki eleman sayısını “sayarken”, İksir de basit bir kurala uyar: sizeişlem sabit zamanda (yani değer önceden hesaplanmışsa) veya lengthişlem doğrusal ise (yani hesaplama) giriş büyüdükçe uzunluk yavaşlar).


0

Bana göre bu biraz "foreach" in "her biri için" daha iyi olup olmadığını sormaya benziyor. Sadece dile / çerçeveye bağlıdır.


Ve ne önemi var? Hangi değişiklikler? Hepimiz iki kişi seçmek ve tutarsız olmak için Java insanlarına kızgın e-postalar yazacak mıyız?
S.Lott

1
Demek istediğim bu. Hangisinin daha iyi olduğunu merak ediyorum. Neyse ne.
EBGreen

0

Bunun kullandığınız dile ve derslere bağlı olduğunu söyleyebilirim . Örneğin, C # 'da Array kullanıyorsanız Özellik Uzunluğuna sahipsiniz, IEnumerable'dan devralınan bir şey varsa, Yöntem Count () uzantısına sahip olursunuz , ancak hızlı değildir. Ve ICollection'dan miras aldıysanız Özellik Sayınız vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.