컬렉션에서 개수 대 길이 대 크기


167

많은 프로그래밍 언어와 라이브러리를 사용하면서 컬렉션의 총 요소 수에 사용되는 다양한 용어를 발견했습니다.

가장 일반적인 것 같다 length, count하고 size.

예.

array.length
vector.size()
collection.count

선호되는 용어가 있습니까? 어떤 유형의 컬렉션에 의존합니까? 즉. 가변 / 불변

메소드 대신 속성이 선호 되는가?


그리고 List.CapacityC #에도 속성이 있습니다.
RBT

새로운 언어가 모호한 용어를 피하기를 바랍니다.
Nikolay Klimchuk

답변:


231

Length() 연속 요소를 참조하는 경향이 있습니다-예를 들어 문자열 길이가 있습니다.

Count() 느슨한 컬렉션의 요소 수를 나타내는 경향이 있습니다.

Size() 컬렉션의 크기를 나타내는 경향이 있습니다. 종종 벡터 (또는 문자열)와 같은 경우 길이와 다를 수 있습니다. 문자열에 10자가있을 수 있지만 저장 공간은 20 개로 예약되어 있습니다. 요소-소스 / 문서를 확인하십시오.

Capacity()-컬렉션에 할당 된 공간을 나타내며 유효한 요소 수가 아닙니다. type에 "capacity"와 "size"가 모두 정의 된 경우 "size"는 일반적으로 실제 요소 수를 나타냅니다.

요점은 인간의 언어와 관용구에 달려 있다고 생각합니다. 문자열의 크기는 매우 분명하지 않은 반면, 세트의 길이는 동일한 것을 참조하는 데 사용하더라도 똑같이 혼란 스럽습니다 (요소 수 )를 수집합니다.


5
"루저 컬렉션"이란 무엇입니까? 크기와 개수의 차이가 보이지 않습니다.
Sophie Alpert

32
@ben : 크기 = 사용 가능한 슬롯, 개수 = 실제 요소. 컬렉션이 가득 차면 size == count.
Steven Evers

8
때문에 Downvoting size()벡터의 요소 수를 의미 하지capacity()... 내가의 발신자 생각하는 C ++ 적어도 vector와의 size의.
Dave Abrahams

10
@DaveAbrahams-나는 그것이 사실이라고 결코 말하지 않았다. 다시 읽으십시오. 나는 그것이 "참조하는 경향이있다"고 말했지만, 모든 언어에서 모든 콜렉션 클래스의 모든 순열에 똑같이 적용되는 구체적인 진술을 시도조차하지 않았다.
gbjbaanb

2
@SnOrfus 나는 당신이 "용량"의 영역으로 갔다고 생각합니다. std::vector예를 들어 (C ++)는 "size"및 "count"를 각각 사용하는 "capacity"및 "size"를 사용합니다. 사실, 모든 것을 에서 std::현재 요소 수, 심지어위한 용도 "크기" std::string(템플릿 호환성과 내 생각에 ... 인간의 편리 완전히 동일한 "길이"에 대한 "크기"를 제공).
Jason C

28

FWIW (그리고 사라지는 것은 거의 없음), 'Count'를 선호합니다. 컬렉션의 요소 / 항목 수를 명확하게 반환한다는 것을 나타 내기 때문입니다.

'길이'또는 '크기'라는 용어에 직면했을 때 나는 종종 얼마나 많은 요소가 컬렉션에 있는지 또는 어떻게 컬렉션이 소비하는 많은 바이트. 이것은 배열이나 문자열과 같은 우연한 컬렉션에 특히 해당됩니다.

그러나 Java, BCL / .Net 또는 C / C ++ 표준 프레임 워크 / 라이브러리에서 사용되는 이름 지정 규칙을 책임지는 사람은 아무도 귀찮게하지 않았습니다.

내가 나보다 훨씬 똑똑하고 Bjarne이라는 이름을 가진 사람이라면 모두 불행을 겪을 수 있습니다 ...

물론, 현실 세계로 돌아가서, 사용중인 언어 / 플랫폼에서 사용하는 이름 지정 규칙 (예 : size()C ++) 을 고수해야합니다 . 이것이 당신의 Array.Length딜레마 에 도움이되는 것 같지는 않습니다 .


16
길이와 크기는 명사이지만 Count도 동사이므로 런타임 (O (n))과 조회 값 (O (1))에서 계산하는 것으로 해석 될 수 있습니다.
mbx

실제로 LINQ : Enumerable.Count
Edward Brey

11

일부 상황에서는 다른 용어를 선호하지만 용어는 다소 상호 교환 가능합니다. 일반적 으로이 요소의 길이 / 크기 / 개수를 다른 사람에게 구두로 어떻게 설명 하시겠습니까?

length()요소의 길이가 있음을 나타냅니다. 문자열은 길이가 있습니다. "문자열의 길이는 20 자"입니다. 그래서 길이가 있습니다.

size()요소의 크기가 있음을 나타냅니다. 예를 들어 파일 크기가 있습니다. "이 파일의 크기는 2MB"입니다. 크기가 있습니다.

즉, 문자열도 크기를 가질 수 있지만 여기에 다른 것이 필요합니다. 예를 들어 UTF-16 문자열의 길이는 100 자이지만 모든 문자가 2 바이트로 구성되므로 크기는 200이 될 것으로 예상됩니다.

count()매우 이례적입니다. Objective-C는 배열의 요소 수에 count를 사용합니다. 배열에 길이가 있거나 (Java에서와 같이) 크기가 있거나 (대부분의 다른 언어에서와 같이) 개수가있는 경우 논쟁 할 수 있습니다. 그러나 크기는 다시 바이트 단위의 크기 일 수 있습니다 (배열 항목이 32 비트 int이면 각 항목은 4 바이트입니다). 길이는 "배열이 20 요소입니다"라고 말하지 않을 것입니다. 나를. "배열에는 20 개의 요소가 있습니다"라고 말하고 싶습니다. count가 그 점을 잘 표현하고 있는지 확실하지 않지만 count는 짧은 형식 elementCount()이며 length () 또는 size ()보다 배열에 대해 더 의미 가 있다고 생각 합니다.

프로그래밍 언어로 고유 한 객체 / 요소를 만드는 경우 프로그래머가 해당 용어를 사용하여 원하는 속성에 액세스하는 데 사용되므로 다른 유사한 요소를 사용하는 것이 가장 좋습니다.


문자열 비유에 따라 파일은을 가져야 length하지만 스토리지마다 다른 스토리지 sizes를 사용하여 데이터를 저장할 수 있습니다 . Java는 java.io.File # length () 에서도 그렇게 생각 하지만 세계의 다른 사람들은 동의하지 않는 것 같습니다.
Ivan Balashov

1
@IvanBalashov 나는 매일 대화에서 "파일 길이"를 사용한 적이 없다. 나에게 파일은 길이가 아니라 크기이며 그 답장에 쓴 것도있다. 우리가 원시 바이트에 대해 이야기 할 때마다 우리는 IMHO 크기에 대해 이야기하고 있으며 더 구체적인 내용이없는 파일은 단지 바이트 수입니다. 길이는 일반적으로 바이트 수를 표현하는 데 사용되지 않지만 함께 묶인 요소의 누적을 표현하는 데 사용됩니다 (바이트는 나에게 요소가 아니며 요소를 형성하는 더 많은 빌딩 블록이며 "문자열로 묶여 있지 않습니다").
Mecki

4

컬렉션에서 항목 수를 찾는 경우 가장 분명하게 사용되는 용어라고 생각합니다. 아직 특정 언어에 특별히 익숙하지 않은 새로운 프로그래머에게는 분명합니다.

컬렉션의 설명 (일명 속성) 인 속성이어야합니다. 방법은 항목의 수를 얻기 위해 컬렉션에 무언가를해야한다는 것을 의미하며 직관적이지 않습니다.


3

흠 ... 크기를 사용하지 않을 것입니다. 바이트 단위의 크기와 혼동 될 수 있기 때문입니다. 길이-결과 메모리 바이트를 사용하는 한 배열에 의미가 있습니다. 비록 ... 길이 ... 무엇에? 카운트는 분명하다. 얼마나 많은 요소. 카운트를 사용합니다.

속성 / 방법에 대해서는 속성을 사용하여 빠름으로 표시하고 방법을 느리게 표시합니다.

그리고 가장 중요한 것은 사용중인 언어 / 라이브러리의 표준을 고수하는 것입니다.


따라서 DataBlock은 몇 바이트입니까? 길이가 있거나 크기가 있습니까?
Mecki

2

@gbjbaanb의 답변에 추가 ...

만약 "property"가 그 가치에 대한 대중의 접근을 의미한다면, "method"가 단순히 캡슐화를 제공하고 구현을 숨기는 것이 바람직하다고 말할 것입니다.

count요소 화 방법이나 유지 관리 방법 에 대한 생각이 바뀔 수 있습니다 count. 그것이 속성이라면, 당신은 붙어 있습니다-그것이 메소드를 통해 접근한다면, 컬렉션의 사용자에게 영향을 미치지 않고 기본 구현을 변경할 수 있습니다.


재산으로 노출 된 이유는 무엇입니까? 속성에는 인터페이스를 손상시키지 않고 쉽게 변경할 수있는 기본 구현이 있습니다. 실제로 대부분의 언어는 컴파일러에서 생성 된 get / set 메소드로 속성을 구현합니다. 직접 호출 할 수는 없습니다.
Scott Dorman

어떤 "대부분의 언어"를 언급하고 있습니까? C, C ++, Java (몇 가지만 말하면)는이 작업을 수행하지 않습니다. 내가 아는 루비와 그루비. 내가 어떻게 대답을 시작했는지 참고하십시오 : " '속성'이 암시하는 경우 ..." 클래스 변경에 대한 인터페이스는 클라이언트가 변화하는 경우 (일반적으로)
켄 젠틀

1

Elixir에는 실제로 언어의 유형에 따라 명확한 이름 지정 체계가 있습니다.

데이터 구조에서 요소의 수를 "계산"할 때 Elixir는 간단한 규칙을 따릅니다 size. 연산이 일정한 시간에 있거나 (즉, 값이 미리 계산 된 length경우 ) 또는 연산이 선형 인 경우 (예 : 계산) 입력이 증가함에 따라 길이가 느려집니다).


0

나에게 이것은 "foreach"가 "for each"보다 나은지 묻는 것과 조금 비슷하다. 언어 / 프레임 워크에 따라 다릅니다.


그리고 무엇이 중요합니까? 어떤 변화가 있습니까? 우리는 모두 Java를 선택하여 일관성을 유지하기 위해 화난 이메일을 Java 사람들에게 쓸 것입니까?
S.Lott

1
그게 내 요점이야 왜 더 좋은지 궁금합니다. 그것이 무엇입니까.
EBGreen

0

나는 그것이 당신이 사용하는 특정 언어수업 에 달려 있다고 말합니다 . 예를 들어 c #에서 Array를 사용하는 경우 Property Length가 있고 IEnumerable에서 상속되는 것이 있으면 확장 메서드 Count ()가 있지만 빠르지는 않습니다. 그리고 ICollection에서 상속받은 경우 속성 개수가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.