2012-02-22 6 views
0

날짜 배열이 다음과 같은 형식으로되어 있습니다 : 10/15/2005 또는 2/10/2011.임의의 날짜 배열을 시간순으로 어떻게 배치합니까?

배열에 10 개의 날짜가 있고 그 중 일부는 중복 될 수 있습니다.

arrDates (9) '요소 0-9은 1 일

들이 연대순으로되도록 요소를 재 배열 할 수있는 가장 좋은 방법은 무엇입니까 대표?

+0

저는 VB 프로그래머가 아니지만 VB 배열에 정렬 된 배열을 자동으로 반환하는'Sort()'메서드가있을 것이라고 생각합니다. 내장 된' DateTime' 형식입니다. C#에서 (.net 프레임 워크의 일부로 동일한 기능을 많이 사용합니다.) 'Array.Sort (myArrayName)'함수가 있습니다. –

답변

1

짧은 목록 (배열)의 경우 보이지 않는 목록 상자 또는 조작 된 ADO 레코드 집합을 사용하거나 간단한 정렬 루틴을 직접 코딩 할 수 있습니다. 성능은 대용량 목록을 정렬 할 때까지는 큰 문제가 아닙니다.

다음은 임시 컬렉션을 사용하는 예입니다. 그것은 다차원 배열을 사용하여 clunky로 빠르게되는 다중 값 항목을 전달할 수 있다는 점에서 Recordset을 사용하는 것과 비슷한 이점이 있습니다. 콜렉션을 사용하기 위해서 당신은 가지고 있어야하는 값 (정렬 키 포함)을 포함하는 작은 클래스를 생성 할 것입니다.

이 특정 방식

는 간단한 순차 검색 (여기에 "J 루프") 대신에 이진 검색을 사용하여 최적화 할 수 있습니다 :

는 "날짜"와 같은 뭔가 물론
Option Explicit 

Private Sub Form_Load() 
    Dim A(9) As String, B(9) As String 
    Dim I As Integer, J As Integer 

    'Create some data, here we'll use String values but Date, 
    'Integer, Double, whatever work as well. 
    Randomize 
    For I = 0 To 9 
     A(I) = CStr(Fix(Rnd() * 100000)) 
     A(I) = Right$(String$(5, "0") & A(I), 6) 
    Next 

    'Sort A() as B(). Could just as easily copy the results 
    'back into A() instead. 
    With New Collection 
     For I = 0 To UBound(A) 
      For J = 1 To .Count 
       If A(I) <= .Item(J) Then 
        .Add A(I), , J 
        Exit For 
       End If 
      Next 
      If J > .Count Then .Add A(I) 
     Next 

     For I = 1 To .Count 
      B(I - 1) = .Item(I) 
     Next 
    End With 

    'Print before and after. 
    AutoRedraw = True 
    Print "A", "B" 
    Print 
    For I = 0 To 9 
     Print A(I), B(I) 
    Next 
End Sub 

A와 표현 문자열 값은 다른 사람이 언급 한대로 정렬을 위해 정규화해야합니다. 여기에는 숫자를 기반으로 문자열 값을 만들고 정규화를 위해 앞에 오는 0으로 패딩하여 시뮬레이션합니다.

+0

떠나기 전에 답을 수락하고 싶었지만 이제는 컴퓨터에 돌아와서 Array.Sort가 없다는 것을 알았습니다. Bob, 당신은 "invisible listbox"옵션을 언급합니다. 그게 뭐야? 그 방법이 어떻게 작동하는지 이해하고 싶습니다. 당신은 정교 할 수 있습니까? – phan

+1

ListBox를 폼에 추가하고 Visible = False 및 Sorted = True 속성을 설정할 수 있습니다. 그런 다음 실행하면 항목을 추가하고 완료되면 List 속성에서 항목을 검색합니다. 이것은 VBA 호스트가 VB6에있는 것과 비슷한 것으로 작동하는 ListBox를 제공한다고 가정합니다. – Bob77

1

가장 쉬운 방법은 YYYYMMDD 형식으로 형식을 지정한 다음 어휘 적으로 정렬하는 것입니다 (사전 식, 문자순, 알파벳순). 어쩌면 우리는 여기에 숫자가 있기 때문에 잘못된 이름 일지 모르지만 아아.

+0

BTW는 VB.NET, C# 또는 Java로 전환하는 것이 그리 좋지 않을까요? –

+0

"어휘 적으로 정렬"이란 의미는 무엇입니까? 나는 그것을 봤고 나는 어휘력으로 뭔가를 정렬하는 방법 ("어휘, 단어 또는 언어의 형태소에 관한")을 얻지 못한다. BTW, Excel에서 VBA를 사용하고 있습니다. VB6에 태그를 추가하면 안됩니다. 실수였습니다. – phan

+0

렉시 칼 (적어도 내가 의미했던 방식)은 '알파벳순, 문자 단위'로 의미합니다. 이 경우 숫자로 숫자를 표시합니다. 예 : '02'는 '10'앞에 오지만 '10'은 '2'앞에옵니다. 따라서 'DD'형식은 '2'를 '02'로 변경합니다. 탐색기에서 이러한 파일 이름으로 파일 이름에 날짜가있는 그림을 정렬하는 것이 좋습니다. –

1

먼저 모든 날짜가 같은 길이 (0 # 형식으로 한 자리 교체)를 가지고해야한다 당신이 그것을 사용하는 방법을 당신이 그 (것)들에게

Here 년대를 포맷 형식 $ 함수를 사용할 수 있습니다. 밥이 옳았다 :

그럼 당신은 그들에게 당신이 그것을

편집을 할 수있는 방법을

Here 's을 (를) 정렬 할 경우에 Array.sort를 사용할 수 있습니다. vb6에서 Array의 Sort 메서드를 사용할 수 없습니다. 직접 정렬 알고리즘을 직접 작성할 수있는 방법을 설명하는 기사 링크를 변경했습니다.

+0

어, 어떻게 이것이 upvote를 얻을 수 있고, 대답은 훨씬 덜 받아 들여질 수 있습니까? 그것은 VB6에서 사용할 수없는 VB.Net 기술을 제안합니다. – Bob77

+0

@BobRiemersma 맞았습니다. 링크가 업데이트되었습니다. – Beatles1692