Q&A

  • 다중 배열 소트
안녕하세요?

다중 배열의 특정 컬럼을 기준으로 나머지 컬럼들까지 소트를 하려고 합니다.
지금은 advstringgrid를 안 보이게 하여 이용하고 있읍니다.
보다 효율적인 방법을 쓰기 위해 배열 자체를 소트하거나 tlist를 이용하려고 합니다.
배열을 쓰던 tlist를 쓰던 사용의 편함에 있어서 큰 차이는 없겠지만 후자가 퀵 소트 메써드를 제공하니 더 편할 건 같은데요.
문제는 다른 컬럼들의 값까지 따라서 소트가 되게 하는 부분입니다.
혹시 소트된 값들의 기존 인덱스를 리턴할 수 있는 쉬운 방법이 있는지요?
만약 없다면 소트되기 전의 배열 값들을 다른 배열에 복사한 뒤 소트 뒤 비교하여 소트 전의 인덱스 값을 구하는 다소 복잡한 방법을 써야 할 거 같은데요.
제가 제대로 접근을 하고 있는 건지 궁금합니다.

그럼 이만.
2  COMMENTS
  • Profile
    김기홍 2007.12.26 06:32
    알고 계시겠지만 소팅은 제일 어려운 문제중에 하나입니다.

    질문하신 것을 정리하면
      1. 현재사용하고 있는 advstringgrid를 대신할 수 있는 2차원배열의 정렬기법
      2. 정렬되기전에 원래의 인덱스를 확인할 수 있는 기법
    인거 같습니다.

    정렬할 자료가 많다면 새로운 방식의 정렬기법을 개발하는 것도 필요하겠지만 대부분 소팅기법이
    퀵소트를 사용하니까 별다른 속도개선이 기대되지는 않습니다.
    그리고 두가지 질문인데 답변은 하나만 해도 될 것 같습니다. 정렬전의 인덱스를 확인한다면 해당
    하는 셀끼리 서로 교환해주면 되겠죠.
    정확하게 검증해본 것은 아니지만 데이타 갯수가 많아지므로(천단위이상) 정렬에 소요되는 시간보다는
    그리드에 출력하는데 사용되는 시간이 더 많아지기 때문에 느리다고 느끼는거 같습니다.

    답변 2. 정렬할 때 인덱스를 포함한 자료도 같이 정렬시켜줍니다.
      일반적인 소팅은 두개의 자료를 교환하는 절차가 있습니다.
      이때 인덱스를 저장한 배열도 같이 교환시켜주면되는 거죠.. 간단합니다.
        swap(a(i),a(j); 에서 끝나지 않고 swap(idx(i),idx(j)); 해주는 거죠.

    답변 1. 위에 방법으로 정렬을 끝낸후 원 인덱스 위치에서 나머지 컬럼들의 내용을 가져오면 됩니다.

    정렬에서 또한가지 필요한 것은 동일한 자료가 있을경우 두번째 소팅키가 필요합니다.
    물론 두개이상의 소팅키를 필요로하는 소팅도 있습니다.
    이럴경우에는 소팅자료를 새롭게 만들어줍니다.
    저는 모든 키에 해당하는 컬럼 내용을 하나의 문자열 자료로 만들어서 1차원 배열을 만듭니다.
    그런후 정렬을 하면 모든 키가 적용된 소팅이 됩니다.
    이때는 문자열 맨뒷부분에 인덱스를 포함해서 소팅한후 인덱스를 다시 복구하면 됩니다.

    숫자를 소팅하는 경우에는 일반적으로 우측정렬된 숫자를 기준으로 정렬해야하며
    이경우에도 숫자가 음수를 포함한다면 내용이 더 힘들어집니다.

    소팅은 그리 쉽지 않은 작업입니다.
    소팅에 많은 시간을 투자하신다면 모를까
    advstringgrid를 그냥 사용하시는 것이 제일 편하실것 같습니다.

  • Profile
    최용일 2007.12.21 00:57
    배열에서 뜬금없이 컬럼이야기가 나와서 한참을 생각했네요...

    쉽게 생각하세요... 여러 컬럼(?)들을 하나의 레코드(묶음)라고 생각하시고 소트를 하세요. 이렇게 되면 1차원 배열 소트하는것과 똑같습니다.

    • minsic
      2008.01.04 06:12
      응용프로그램으로 구현하신다면 activex 만들어서 하시면 되고 순순 웹으로 구현하신면 엑셀을 html이...
    • 봉봉
    • 2007.12.27 02:14
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 소울해커
      2008.01.11 00:29
      델파이 강의실에서 나노시스의 그래픽 강좌 라는 제목으로 자세하게 나와있습니다.
    • 김범진
    • 2007.12.27 00:42
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김춘경
      2007.12.28 07:48
      FormCreate 프로시저에서 발생하는 AccessViolation 에러는 주로 해당 기능을 가진 폼이 아직 생성되지 않...
    • bluehill
      2008.01.08 02:31
      한가지 꽁수를 알려드립니다. 메뉴를 hidden으로 만들고 short key프로퍼티에 ESC를 넣어보세요.
    • 3K
    • 2007.12.26 23:32
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김무승
    • 2007.12.26 21:59
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 송 시중
      2007.12.26 19:43
      그냥 공용 pas하나 만들고 connection을 둬서, 각 폼에선 그 connection을 사용하게 하면 되지요.
    • Terry KIM
      2007.12.26 20:54
      감사합니다. 메인폼을 하나 만들고, 거기에 ADOConnection을 두고 실행하니 한번만 비밀번호를 묻는군요....
    • Marek
      2008.01.04 09:37
      안녕하세요 설명하신 내용으로는 이해가 잘 안갑니다. 통상 그런 결과가 나오진 않거든요. 상황을 좀 ...
    • 하덕진
    • 2007.12.26 10:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2008.01.12 08:23
      아래를 참고하세요 ~ <!--CodeS--> Procedure SaveStringsAsUnicode( const thefilename:String;...
    • jeijei
    • 2007.12.26 10:08
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김춘경
      2008.01.07 16:05
      저도 몇 년 전에 오라클을 사용하면서 레코드 카운트가 예상값과 달라서 고민하다가 이 명령을 사용한 기억...
    • jeijei
      2008.01.12 03:29
    • jeijei
      2007.12.26 05:25
      select문을 썼는데 데이터가 삭제된다면 안돼죠.. 데이터저장이 확실히
    • 신명곤
      2007.12.27 07:19
      먼저 jeijei님께 감사드립니다. 드디어 해결했습니다. 항상 query를 열고 닫을때 사용하는 close와 sql...
    • bluehill
      2008.01.08 01:12
      graphic32의 layer기능을 리용하면 크기조절과 이동만이 아니라 회전과 zorder조종도 가능합니다. 프리웨...
    • 김길현
    • 2007.12.25 15:21
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김길현
      2008.01.01 01:09
      XML 해더를 추가 하려면요. ISoapHeaders 클래스를 이용해서 사용하시면 됩니다. H라는 클래스( I...
    • 허학송
    • 2007.12.21 20:12
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2007.12.21 21:38
      델파이 IDE에서 실행시 기본적으로 예외를 처리하더라도 예외가 보이도록 설정이 되어 있습니다. 탐색기에...
    • jeijei
      2007.12.22 09:00
      답변 감사합니다. 그런데 탐색기에서 실행하란 말씀은 무슨뜻인지요? 컴파일된 EXE화일을 실행하면 된...
    • 최용일
      2007.12.24 18:05
      네... exe파일을 실행하시면 됩니다. 델파이에서 F9눌러서 실행하시면 기본적으로 예외처리를 하셔도 예...
    • jeijei
      2007.12.25 08:02
      답변 감사드립니다..
    • 델초보
    • 2007.12.21 09:48
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 정형준
      2007.12.23 01:09
      다른 분들의 설명 모두 맞습니다. 전체적으로 보면 보통 이렇게 합니다. <!--CodeS-->  &n...
    • 최용일
      2007.12.21 19:46
      Close가 조회한 결과(데이터셋)을 닫는 명령입니다. Open다음에 Close를 쓰시니까 당연히 조회가 안되죠......
    • 정경철
      2007.12.22 03:56
      참고!!! 2번 버튼을 눌렀으니.. 똑같은 쿼리 문이 2번 들어 갔겠죠.. 쿼리문 넣기전에  sql....
    • 델초보
    • 2007.12.21 08:29
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2007.12.22 02:00
      안녕하세요... 아래코드를 참고하세요.. procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; co...
    • 이종탁
      2007.12.21 09:29
      가로면 Row 값을 말씀하시는 건가요? dbgrid 에 연결된 DataSet 을 읽으면 됩니다. 예를 들어 ...
    • 김기홍
      2007.12.26 06:03
      일반적인 정형파일은 아닐거구 파일 확장자는 별다른 의미가 없을수도 있구요. 스트림저장되었을거니까 정...
    • 임정미
      2007.12.26 22:26
      관심 가져주셔서 감사합니다. 말씀하신대로 이것저것 해봐야할것 같군요  도움이 됐습니다.^^ ...
    • 최용일
      2007.12.21 19:43
      데이터가 실수인듯하니까 읽으실때 문자단위가 아니라 실수단위로 읽어보세요... 델파이에서 실수형은 D...
    • 김범진
    • 2007.12.20 20:55
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김기홍
      2007.12.26 06:32
      알고 계시겠지만 소팅은 제일 어려운 문제중에 하나입니다. 질문하신 것을 정리하면   1. 현...
    • 최용일
      2007.12.21 00:57
      배열에서 뜬금없이 컬럼이야기가 나와서 한참을 생각했네요... 쉽게 생각하세요... 여러 컬럼(?)들을 하...
    • 스터디
    • 2007.12.20 18:13
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이종탁
      2007.12.21 09:36
      DBGrid에 바로 나타낼 수 있는 방법은 없어 보이네요. 굳이 DBGrid를 써야 한다면 저라면 일단 값을...