2011-12-27 6 views
0

내가 찾은 정규식 정렬 중 일부를 시도했지만 스트림의 + 기호가 마음에 들지 않을 것이라고 생각합니다. 정렬이 필요합니다. .숫자가 동일 할 때 알파 순서를 유지하는 스트림의 숫자 정렬

array[0] = "XXA+300" // 300 being the lowest num and XXA being before XXX 
array[...] 
array[7] = "AAA+800" 

I : 그래서 나는 (64000 번호에 '+'0을 3 ~ 30 자) 다음과 같습니다 데이터 스트림

userString = "AAA+800|BBB+700|CCC+600|ZZZ+500|YYY+400|XXX+300|XXA+300|XXZ+300"; 

출력 형식으로 할 필요가 받고 있어요 가장 낮은 숫자에서 가장 높은 숫자로 순서를 바꾼다. 여기 내 비효율적 인 코드입니다. 8x8 회 반복됩니다. (내 스트림 어쩌면 200 항목 길이)

그것은 작동하지만, 그것은 더러워 보입니다. 누군가 그것을 개선하여 반복을 적게 사용하도록 도와 줄 수 있습니까?

var array = userString.split('|'); 

array.sort(); 

for(var i=0; i<len; i++) {   // array2 contains just the numbers 
    bits = array[i].split('+'); 
    array2[i] = bits[1]; 
} 

array2.sort(); 
if(sort_order==2) 
    array2.reverse(); 

var c=0; 
for(var a=0;a<len;a++) {   // loop for creating array3 (the output) 
    for(var i=0; i<len ; i++) {  // loop thru array to find matching score 
     bits = array[i].split('+'); 
     if(bits[1] == array2[a]) { // found matching score 
      array3[c++] = bits[0]+'+'+bits[1]; // add to array3 
      array[i]='z+z';  // so cant rematch array position 
     } 
    } 
} 
array = array3; 

친절 감사

답변

0

내가 아이폰에이 타이핑 한, 간결한 대답 (및 테스트의 부족을) 용서하십시오.

var userArr = userString.split('|'); 

userArr.sort(function(a, b) { 
    var aArr = a.split('+'), 
     bArr = b.split('+'), 
     aLetters = aArr[0], 
     bLetters = bArr[0], 
     aNumbers = parseInt(aArr[1]), 
     bNumbers = parseInt(bArr[1]); 

    if (aNumbers == bNumbers) { 
    return aLetters.localeCompare(bLetters); 
    } 

    return aNumbers - bNumbers; 
    /* 
    // Or, for reverse order: 
    return -(aNumbers - bNumbers); 

    // or if you prefer to expand your terms: 
    return -aNumbers + bNumbers; 

    */ 
}); 

는 기본적으로 우리는 우리가 + 다시 분할하는 사용자 지정 정렬을하고 |에 분할하고 있습니다. 숫자를 정수로 변환 한 다음 값이 다를 경우 (예 : 300800) 직접 비교하고 결과를 반환합니다 (이 경우 글자가 잘못 되었기 때문에). 동일하면 ( 300300) 첫 번째 부분 ( XXAXXX)을 비교하여 그 결과를 반환합니다 (일반적인 알파벳순 비교를 원한다고 가정). 이 방식으로 전체 배열이 정렬됩니다.

나는 당신이 당신의 질문에서 "반전 된"것이 무엇을 의미하는지 완전히 알지 못했지만, 잘하면 이것이 시작될 것입니다.

짐작할 수 있듯이 이전 반복에서 이미 수행 한 경우에도 모든 반복에서 모든 요소에 대해 splitparseInt을 수행하므로 완전히 최적은 아닙니다. 이것은 입력을 사전 처리하여 간단하게 해결할 수 있지만 200 개의 요소만으로도 큰 성능 저하는 없을 것입니다.

행운을 빈다.

+0

안녕하십니까,에서와 같이 숫자가 반전되지만 알파는 여전히 순서대로 유지됩니다. 사실이 오류가 발생합니다 : 객체 800에 'localeCompare'메서드가 없습니다. – ChrisAdmin

+0

어떤 브라우저입니까? 이 오류는 문자열이 아닌 객체에서'localeCompare'를 호출하고 있음을 나타냅니다. 다른 오류처럼 디버그하십시오. 'userArr','aLetters','bLetters'는 각각의 반복에서 당신이 기대하는 것을 포함하고 있는지 확인하십시오. 그렇지 않다면 이유를 알아 내십시오. 숫자를 반대로하려면 'return aLetters.localeCompare ...'를'return -aLetters.localeCompare ... '로 변경하십시오. 추가 읽기 : [(1)] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/localeCompare) [(2)] (https://developer.mozilla.org/en/JavaScript)/참조/Global_Objects/배열/정렬). –

+0

@Jordan, 전화에 게시물을 입력 하시겠습니까? 영웅이나 중독자 :-) – Kos

관련 문제