conta contro lunghezza contro dimensione in una raccolta


167

Dall'utilizzo di una serie di linguaggi e librerie di programmazione ho notato vari termini usati per il numero totale di elementi in una raccolta.

Il più comune sembra essere length, counte size.

per esempio.

array.length
vector.size()
collection.count

C'è un termine preferito da usare? Dipende dal tipo di collezione che è? vale a dire. mutevole / immutabili

C'è una preferenza per essere una proprietà anziché un metodo?


E c'è anche List.Capacityproprietà in C #.
RBT

Spero che nuove lingue evitino termini ambigui.
Nikolay Klimchuk,

Risposte:


231

Length() tende a riferirsi ad elementi contigui, ad esempio una stringa ha una lunghezza.

Count() tende a fare riferimento al numero di elementi in una raccolta più libera.

Size() tende a fare riferimento alla dimensione della raccolta, spesso può essere diversa dalla lunghezza in casi come vettori (o stringhe), ci possono essere 10 caratteri in una stringa, ma l'archiviazione è riservata a 20. Può anche riferirsi al numero di elementi - controlla la fonte / documentazione.

Capacity()- usato specificamente per fare riferimento allo spazio allocato nella raccolta e non al numero di elementi validi in essa contenuti. Se il tipo ha sia "capacità" che "dimensione" definite, "dimensione" di solito si riferisce al numero di elementi effettivi.

Penso che il punto principale sia il linguaggio umano e gli idiomi, la dimensione di una stringa non sembra molto ovvia, mentre la lunghezza di un set è ugualmente confusa anche se potrebbero essere usati per riferirsi alla stessa cosa (numero di elementi ) in una raccolta di dati.


5
Quindi cos'è una "collezione più flessibile"? Non vedo la differenza tra dimensioni e numero qui.
Sophie Alpert,

32
@ben: size = slot disponibili, count = elementi reali. size == conta quando la raccolta è piena.
Steven Evers,

8
Il downvoting perché si size()riferisce al numero di elementi nel vettore, non al suo capacity()... almeno in C ++, che penso sia il creatore di vectors con sizes.
Dave Abrahams,

10
@DaveAbrahams - Non ho mai detto che fosse così. Leggilo di nuovo Ho detto che "tende a fare riferimento", non ho mai nemmeno provato a fare una dichiarazione specifica che si applicava ugualmente a tutte le permutazioni di tutte le classi di raccolta in tutte le lingue.
gbjbaanb,

2
@SnOrfus Penso che tu sia entrato nel regno della "capacità" lì. std::vector(C ++) ad esempio usa "capacità" e "dimensione" dove si usano rispettivamente "dimensione" e "conteggio". In realtà, tutto in std::usi "size" per il conteggio elemento corrente, anche std::string(che fornisce "dimensioni" per la compatibilità modello e una del tutto identico "lunghezza" per ... convenienza umana immagino).
Jason C,

28

FWIW (e questo è quasi del tutto assente), preferisco "Count" perché sembra indicare che restituirà il numero di elementi / elementi nella raccolta in modo abbastanza inequivocabile.

Di fronte ai termini "Lunghezza" o "Dimensione", mi viene spesso lasciato per un momento (o addirittura costretto a rileggere la documentazione) se la dannata cosa mi dirà quanti elementi ci sono nella collezione o come molti byte che la raccolta sta consumando. Ciò è particolarmente vero per le raccolte che devono essere contingenti come matrici o stringhe.

Ma nessuno che era responsabile delle convenzioni di denominazione utilizzate dai framework / librerie standard Java, BCL / .Net o C / C ++ si è preso la briga di chiedermelo, quindi siete tutti bloccati con qualsiasi cosa abbiano escogitato.

Se solo fossi molto più intelligente di me e fossi chiamato Bjarne, a tutti voi potrebbe essere risparmiata la sofferenza ...

Naturalmente, nel mondo reale, dovresti provare a rispettare qualsiasi convenzione di denominazione utilizzata dal linguaggio / piattaforma che stai utilizzando (ad es., size()In C ++). Non che questo sembra aiutarti con il tuo Array.Lengthdilemma.


16
Mentre Lunghezza e Dimensione sono nomi, Count è anche un verbo, quindi potrebbe essere interpretato come il conteggio in fase di esecuzione (O (n)) rispetto alla ricerca di un valore (O (1)).
MBX

In effetti, è esattamente così che viene utilizzato in LINQ: Enumerable.Count
Edward Brey,

11

I termini sono in qualche modo intercambiabili, sebbene in alcune situazioni preferirei l'uno all'altro. Di solito puoi ottenere il miglior utilizzo se pensi a Come descriveresti verbalmente la lunghezza / dimensione / conteggio di questo elemento ad un'altra persona?

length()implica che l'elemento ha una lunghezza. Una stringa ha una lunghezza. Dici "una stringa è lunga 20 caratteri", giusto? Quindi ha una lunghezza.

size()implica che l'elemento ha una dimensione. Ad esempio un file ha una dimensione. Dici "questo file ha una dimensione di 2 MB", giusto? Quindi ha una dimensione.

Detto questo, una stringa può anche avere una dimensione, ma mi aspetterei qualcos'altro qui. Ad esempio una stringa UTF-16 può avere una lunghezza di 100 caratteri, ma poiché ogni carattere è composto da due byte, mi aspetto che la dimensione sia 200.

count()è molto insolito. Objective-C utilizza count per il numero di elementi in un array. Si potrebbe obiettare se un array ha una lunghezza (come in Java), ha una dimensione (come nella maggior parte delle altre lingue) o ha un conteggio. Tuttavia, la dimensione potrebbe essere di nuovo la dimensione in byte (se gli elementi dell'array sono a 32 bit int, ogni elemento è 4 byte) e la lunghezza ... Non direi "un array è lungo 20 elementi", che suona piuttosto strano a me. Direi "un array ha 20 elementi". Non sono sicuro che il conteggio lo esprima molto bene, ma penso che contare sia qui una forma abbreviata elementCount()e che di nuovo ha molto più senso per un array di lunghezza () o dimensione ().

Se si creano oggetti / elementi propri in un linguaggio di programmazione, è meglio usare qualunque altro elemento simile, poiché i programmatori sono abituati ad accedere alla proprietà desiderata usando quel termine.


A seguito dell'analogia delle stringhe, un file deve avere un length, ma archivi diversi potrebbero utilizzare diversi sizesper archiviare i suoi dati. Anche Java lo pensa in java.io.File # length () , ma sembra che il resto del mondo non sia d'accordo.
Ivan Balashov

1
@IvanBalashov Non ho mai usato "lunghezza del file" nei discorsi quotidiani, per me un file non ha lunghezza ma una dimensione ed è anche quello che ho scritto nella mia risposta. Ogni volta che parliamo di byte grezzi stiamo parlando di dimensioni IMHO e un file senza contenuto specifico più vicino è solo un mucchio di byte. La lunghezza di solito non è usata per esprimere il conteggio dei byte ma per esprimere un accumulo di elementi messi insieme (i byte non sono elementi per me, più i mattoni per formare gli elementi e non sono anche "messi insieme").
Mecki,

4

Conte penso che sia il termine più ovvio da usare se stai cercando il numero di articoli in una collezione. Ciò dovrebbe anche essere ovvio per i nuovi programmatori che non si sono ancora particolarmente affezionati a una determinata lingua.

E dovrebbe essere una proprietà così com'è: una descrizione (aka proprietà) della collezione. Un metodo implicherebbe che deve fare qualcosa per la raccolta per ottenere il numero di elementi e questo sembra poco intuitivo.


3

Hmm ... Non userei le dimensioni. Perché questo potrebbe essere confuso con la dimensione in byte. Lunghezza: potrebbe avere un senso per gli array, purché utilizzino i conseguenti byte di memoria. Anche se ... lunghezza ... in cosa? Il conteggio è chiaro. Quanti elementi Vorrei usare il conteggio.

A proposito di proprietà / metodo, vorrei usare la proprietà per contrassegnare è veloce e il metodo per contrassegnare è lento.

E, il più importante, mi atterrei agli standard delle lingue / librerie che stai usando.


Che dire di un DataBlock, solo un mucchio di byte. Ha una lunghezza o ha una dimensione?
Mecki,

2

Aggiunta alla risposta di @ gbjbaanb ...

Se "proprietà" implica l'accesso del pubblico al valore, direi che "metodo" è preferito semplicemente per fornire l'incapsulamento e nascondere l'implementazione.

Potresti cambiare idea su come countelementi o su come mantenerlo count. Se è una proprietà, sei bloccato: se viene acceduto tramite un metodo, puoi modificare l'implementazione sottostante senza influire sugli utenti della raccolta.


Perché sei "bloccato" se viene esposto come proprietà? Le proprietà hanno un'implementazione sottostante che può cambiare altrettanto facilmente senza interrompere l'interfaccia. In effetti, la maggior parte delle lingue implementa le proprietà come metodi get / set generati dal compilatore comunque ... non puoi semplicemente chiamarle direttamente.
Scott Dorman,

A quale "maggior parte delle lingue" ti riferisci? C, C ++, Java (solo per citarne alcuni) non lo fanno. Ruby e Groovy lo so. Nota anche come ho iniziato la risposta: "Se 'proprietà' implica ..." Perché bloccato? Se l'interfaccia della classe cambia, i clienti devono cambiare (in generale)
Ken Gentle,

1

In Elixir esiste in realtà un chiaro schema di denominazione associato a tutti i tipi nella lingua.

Quando "conta" il numero di elementi in una struttura di dati, Elisir rispetta anche una semplice regola: la funzione viene denominata sizese l'operazione è in tempo costante (ovvero il valore è precalcolato) o lengthse l'operazione è lineare (ovvero calcolo la lunghezza diventa più lenta all'aumentare dell'input).


0

Per me, è un po 'come chiedere se "foreach" è meglio di "per ciascuno". Dipende solo dalla lingua / dalla struttura.


E che importa? Cosa cambia Scriveremo tutti e-mail arrabbiate con la gente di Java per averne scelto due ed essere incoerenti?
S. Lott,

1
Questo è il mio punto. Perché chiedersi quale è meglio. È quello che è.
EBGreen

0

Direi che dipende dal linguaggio particolare che stai usando e dalle classi . Ad esempio in c # se stai usando Array hai Lunghezza proprietà , se hai qualcosa che eredita da IEnumerable hai l'estensione Metodo Count (), ma non è veloce. E se hai ereditato da ICollection hai il Conteggio proprietà .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.