2012-07-08 2 views
5

이것은 매우 간단한 질문처럼 보입니다. 그러나 인터넷에서 놀랍도록 거의 쓰지 않았으며, 올바르게 구현하는 데 어려움을 겪고 있습니다. 무엇이 가장 좋은 방법은 비교를 구현하는 가장 좋은 방법은 자바의 ASCII 문자에 대한 비교 "래핑 주위에"알파벳의 끝은 무엇입니까? 나는 임의의 위치에서 전체 알파벳을 분할 할 수있는 "between"함수에 사용하고, 'y'가 'x'와 'b'사이에 있는지 물으면 올바르게 "true"를 반환합니다.문자의 모듈 비교

나는 이미 모든 질문과 문자에 모듈 산술에 대해 이야기 답변을 발견했습니다, 그래서 나는 다음과 같은 코드로 (문자 이동) 모듈 추가 작업을 수행하는 방법을 알고

그러나
char shifted = (((original - 'a') + 1) % 26) + 'a'; 

, 이것은 Java의 모듈러 산술 함수를 기반으로합니다.이 함수에는 비교할 수있는 함수가 없습니다. 비록 내가 평범한 int를 사용했다하더라도, 나는 <b < c mod 26 (a = 24, b = 25, c = 1이면 true를 반환해야 함)이라면 자바를 찾을 방법이 없다.

일반적인 질문은 모듈 식 을 구현하는 가장 좋은 방법은 Java에서 연산을 수행하는 것입니다. 문제가 너무 어렵다면 최소한 아스키 알파벳에 대한 비교를 할 수있는 방법이 있습니까?

+0

"모듈 비교"는 이진 비교에 적합하지 않음에 유의하십시오. 모듈러 산술에 "덜한"순서는 없습니다. "사이에"있는 일이 여전히 가능하기 때문에 귀하의 질문 담당자가 유효합니다. – MvG

답변

2

순환 대기열에서 A < B < C을 테스트 할 때 항상 A <= B으로 간주 될 수 있으며 둘 중 하나를 감쌌다.

A < B 인 경우 랩핑이 발생하지 않습니다. B < C or C < A이면 B는 A와 C 사이에 있습니다.

A > B이면 줄 바꿈을했습니다. B < C and C < A이면 B는 A와 C 사이에 있습니다.

A == B, B == C 또는 A == C를 처리하는 방법은 스스로 정의해야합니다.

+0

이것은 훌륭하게 간단합니다. 가장 좋은 점은 알파벳의 길이에 의존하지 않는다는 것입니다. 따라서 매직 넘버 26을 바꾸지 않고 구두점이나 유니 코드 문자를 문자열에 넣을 수 있더라도 동일한 기능을 사용할 수 있습니다. – Edward

+0

16 진수 또는 16 진수와 같이 끝점에서 끝점까지 필적할만한 값을 가진 영문자. – phatfingers

1

귀하의 질문은 다음과 같습니다. 알파벳 c_2c_3 사이의 문자 c_1 (알파벳은 랩 어라운드 임)?

  • 변환 숫자에 각 문자 (즉, a = 1, b = 2, ..., z = 26). 귀하의 예에서는 c_1 = 'y' = 25 (c_2 = 'x' = 24c_3 = 'b' = 2 사이)입니다.
  • c_3 < c_2 인 경우 26을 c_3에 추가하십시오. 귀하의 예에서는 2 < 24이므로이 경우입니다.
  • 이제 우리는 c_1 = 25, c_2 = 24c_3 = 28을가집니다.
  • c_1 >= c_2 && c_1 <= c_3이 들어 있는지 확인하십시오. 그 경우 문자는 두 경계 사이에 있습니다. 유지되지 않으면 다음 단계를 계속하십시오.
  • 26을 c_1에 더하고이 값이 위의 검사를 만족하는지 확인하십시오. 그 경우 문자는 줄 바운드 범위 내에 있습니다. 그렇지 않으면 중지합니다.

이 접근법에서는 기본적으로 '두 번째'알파벳에 26을 추가합니다. 그래서 :

... 23 24 25 26 1 2 3 4 

이된다 : 당신이 일반적으로하는 것처럼

... 23 24 25 26 27 28 29 30 

그런 다음 연산을 수행 할 수 있습니다.

편집 : MvG의 의견에 따라 알고리즘을 업데이트했습니다. 실제로 여러 상황이 있습니다 : "24와 2 사이에 25입니까?" 또한 "24와 2 사이에 1입니까?" 후자의 경우, (1 + 26)이 24와 (2 + 26) 사이인지 확인해야합니다. 그러면 'a'문자가 실제로 'x'와 'b'사이에 오도록 유지됩니다.

+0

또한'c_1'에 26을 추가하여 범위 내에 있는지 확인해야합니다. – MvG

+0

@MvG : 감사합니다. 자세한 내용으로 답변을 업데이트했습니다. –

0

취향에 따라 if 문 대신 modulus 연산자를 사용할 수 있습니다.

public static boolean isStrictlyBetween(char a, char x, char b) { 
    // assuming x, a, and b are all the same case (lower or upper). 
    return ((x - a + 26) % 26) < ((b - a + 26) % 26); 
} 

이 코드는 X에에서 시계 방향으로 거리가 A와 B에서 시계 방향으로 거리보다 작 으면 true를 돌려 말한다 : 한 줄의 비교를 수행하려면 같은 것을 할. +26은 차이 표현의 결과가 양수임을 나타냅니다 (일부 언어에서는 음수의 %가 이상하게 나타납니다). % 26은 원하는 모듈러스를 수행합니다.