그리드, 보고서, 드롭 다운 상자 등에서 사용자에게 데이터를 표시한다고 가정 해 보겠습니다. 문제의 데이터에는 인보이스 번호 라는 필드가 있습니다. 이 필드에는 2/3의 숫자 만 포함되지만 나머지 1/3은 영숫자의 혼합입니다.

이로 인해 모든 정렬 알고리즘은 숫자가 아닌 숫자로 알파벳을 정렬합니다. . 이러한 이유로 1000은 99보다 훨씬 이전에 올 것입니다. 첫 번째 숫자는 전체 값이 아니라 정렬되기 때문입니다. 000333과 같은 다른 항목은 “333”으로 취급되지 않으며 222 이전에 표시됩니다.

여기에 표준이 있습니까? 모든 값을 숫자 값으로 변환하고 다르게 정렬해야합니까? 그들은 어떻게 다시 통합 될까요? 아니면 영숫자 정렬이 올바른 방법입니까?

댓글

  • 말할 수있는 능력이 있다면 하위 문자열을 사용하여 처음 세 개를 자릅니다. 알파벳이 있고 마지막 세 자리만을 기준으로 정렬하는 숫자, 귀하의 경우 ABC333 및 000222라고 말하면 이것을 구현할 수 있습니다. 물론 표시하는 동안 000222와 ABC333 순서로 표시됩니다. 그러나 시각적으로 몇 가지 숫자에 대해 0을, 다른 숫자에 대해 알파벳을 보는 것은 약간 혼란 스러울 것입니다. 알파벳은 무엇을 암시합니까?
  • 길이가 다르므로 SubString이 없습니다. " 10 "가 " 9 (실제로 9 이전의 FAR)는 영숫자를 자주 사용하지 않는 ' 사용자에게 혼동을 줄 수 있습니다. 반면에 이들의 순수한 혼합은 ' 제가 볼 수있는 좋은 방식으로 정렬 할 수 없습니다.
  • 이것들이 인보이스 인 경우 정렬 할 수 있습니까? 날짜별로 또는 송장 번호 자체에 따라 명시 적으로 정렬해야합니까? 테이블에서 다른 열을 사용하여 그에 따라 정렬 할 수 있습니다. 이러한 항목이 오름차순으로 생성된다고 가정하면 가장 빈번하게 생성되는 송장이 맨 위에있는 시간 순서대로 작성하는 것이 좋습니다. 드롭 다운이 실제로 무엇인지 또는 사용자가 정렬에서 어떤 이점을 얻을 수 있는지 잘 모르겠습니다. 현장 사용에 대해 더 많이 알려 주시면 훨씬 더 도움이 될 것입니다!
  • '는 사용자에게 달려 있습니다. 보고를 통해이 데이터를보고, Net 30 (한 공급 업체의 모든 송장보기)에 대한 잔액을 확인할 수있는 회계 화면 등을 통해 볼 수 있습니다. 사용자는 화면 또는 보고서 정렬 방법을 선택합니다. 날짜는 옵션입니다. 그러나 송장 번호도 마찬가지입니다. 내 응용 프로그램에서 생성되지 않았습니다. 공급 업체로부터 소모품, 부품 등을 주문합니다. 특정 공급 업체는 송장 번호를 귀하에게 돌려줍니다. 5 개의 온라인 상점에서 주문하고 5 개의 주문 번호를받은 경우와 같습니다. 일부는 숫자가 아닙니다.
  • 이 숫자를 숫자 형식으로 변환해야합니다. 영숫자 값을 정렬 할 때만 사용하십시오. 더 많은 혼란을 야기하기 위해 변환 된 숫자를 사용자에게 보여줄 필요는 없습니다. 그러나 예를 들어 영숫자를 보완하기 위해 날짜와 같은 다른 열을 사용하는 것이 좋습니다. 영숫자 정렬은 약간 혼란 스러울 것이므로 사용자가 관련 날짜 또는 다른 항목을 파악하는 데 도움이되는 다른 열이 많은 도움이 될 것입니다.

답변

Windows 7부터 Microsoft는 파일 이름별로 디렉토리를 정렬하는 기본 방법을 “숫자”정렬을 사용하도록 변경했습니다. (일부 정보는 여기 )

동작 사양을 찾을 수는 없지만 리버스 엔지니어링을 수행했습니다.이 알고리즘은 두 개의 영숫자 문자열을 비교하고 어느 것이 먼저 오는지 결정합니다.

  • 각 파일 이름을 알파벳과 숫자 부분으로 분할합니다. 즉, 이름 text123moretext456가 목록 {"text", "123", "moretext", "456"}

  • 두 분할 이름의 각 부분에 대해 다음 비교를 수행합니다.

    • 두 부분이 모두 숫자 인 경우 비교 숫자로
      • 숫자가 같으면 문자열로 비교
      • 문자열이 같으면 다음 부분으로 이동
    • 두 부분이 완전히 문자 인 경우 문자열로 비교
      • 동일하면 다음 부분으로 이동
  • 부품이 부족하면 부품 수가 가장 적은 이름이 나옵니다. irst

다음과 같은 순서로 끝납니다.

2 12 200000 1000000 a a12 b2 text2 text2a text2a2 text2a12 text2b text12 text12a 

댓글

  • 정확히 제가 찾던 내용이며 결과 정렬 순서가 의미가 있습니다. 감사합니다!

답변

이 질문 (특히 @Harrison Paine의 답변)이 도움이되었습니다. 내 프로젝트와 향후 참조를 위해 그의 답변의 [javascript] 구현을 제공하고 싶습니다.정렬은 다음과 같습니다. function :

var win7sort = function(a, b) { var regex = /[^\d]+|\d+/g; // Split each filename into alphabetical and numeric parts var ar = a.match(regex); var br = b.match(regex); var localeCompare; // For each part in the two split names, perform the following comparison: for(var ia in ar) { for(var ib in br) { var ari = ar[ib]; if(ari == undefined) { ari = ""; } var bri = br[ib]; if(bri == undefined) { bri = ""; } // If both parts are strictly numeric, compare them as numbers if(!isNaN(ari) && !isNaN(bri)) { localeCompare = ari.localeCompare(bri, {}, { numeric: true }); } else { localeCompare = ari.localeCompare(bri, {}, { ignorePunctuation: true, sensitivity: "base" }); } if(localeCompare != 0) { // If you run out of parts, the name with the fewest parts comes first return localeCompare; } // If they"re the same, move on to the next part } } return localeCompare; }; 

사용 방법은 다음과 같습니다.

var list = ["1", "a", "z", "new folder 2", "new folder 03", "new folder 03-a", "new folder 039", "new folder 5", "new folder 41", "2", "21", "3", "41", "100"]; var sortedList = list.sort(win7sort); 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다