2014-10-29 3 views
0

IT 학교에 다녔고 JAVA 공부를 시작했으며 IP 주소가있는 노드 네트워크를 통해 전달되는 시뮬레이션 된 간단한 "메시지"와 같은 프로젝트를 수행해야했습니다.JAVA : 사전 적으로 두 개의 문자열 비교

전체 프로젝트는이 질문의 목적에 중요하지 않습니다.

우리는 IPAddress 클래스를 가지고 있는데 그 중 하나는 세 개의 IP 주소 개체를 비교하여 첫 번째 IP 개체가 다른 두 개체의 "범위 내에"있는지 여부를 결정하는 것입니다.

예를 들어 노드를 시스템에두고 노드 N1 (전체 노드 클래스는 있지만 atm은 중요하지 않음)이라고하고 노드에 "Hello"라는 메시지가있는 패키지 (자체 클래스)가 있습니다.

패키지는

시스템은 IP가 범위를 않는 보여줍니다 뭔가 (무관) 및 IP 주소 범위 (의 IP 주소가 N1에 그것을 통과하고 싶어 127.0.0.1의 IP 주소를 가지고

:

127.0.0.0 (하한)과 127.0.0.255 (상한)

하여 IPAddress 클래스 InsideRange 방법은 다음과 같은 방식으로 제와 비교 ​​매개 변수로 두 IP를 수신 중) 처리

public boolean insideRng(IPAddress lower, IPAddress upper){ 
    String this_str = this.toString(); 
    String lower_str = lower.toString(); 
    String upper_str = upper.toString(); 
    String[] addressses = {this_str, lower_str, upper_str}; 
    for (int i=0; i<addressses.length; i++){ 
     String[] tmp = addressses[i].split("\\."); 
     addressses[i] = String.format("%3s.%3s.%3s.%3s",tmp[0],tmp[1],tmp[2],tmp[3]); 
    } 
    String address = addressses[0]; 
    Arrays.sort(addressses); 
    return (addressses[1].equals(address)); 
} 

이 경우 127.0.0.1은 내부 127.0.0.0과 127.0.0.255이므로 true를 반환합니다.

나는 위의 코드를 작성하지 않았지만 친구에게 도움을 요청했습니다.

public boolean insideRng(IPAddress lower, IPAddress upper){ //nem mukodott 
    String lower_str = lower.toString(); 
    String upper_str = upper.toString(); 
    String this_str = this.toString(); 
    return (lower_str.compareTo(this_str) <= 0 & upper_str.compareTo(this_str) >= 0); 
} //(This is my version. THIS DOES NOT WORK) 

내 질문은, 왜 광산이 작동하지 않습니다되는 이유는 다음과 같습니다 : 내 버전이 제대로 (그것이 때로는에 상한 또는 하한의 외부에있는 IP에 대해 true를 반환) 작동하지 않았다입니까? 그리고 :

이 부분 할을 수행하고 왜 그냥 가면 모든

for (int i=0; i<addressses.length; i++){ 
    String[] tmp = addressses[i].split("\\."); 
    addressses[i] = String.format("%3s.%3s.%3s.%3s",tmp[0],tmp[1],tmp[2],tmp[3]); 
} 

에 필요한 for 루프가 왜 작동하지 않습니다 무엇

:

public boolean insideRng(IPAddress lower, IPAddress upper){ 
    String this_str = this.toString(); 
    String lower_str = lower.toString(); 
    String upper_str = upper.toString(); 
    String[] addressses = {this_str, lower_str, upper_str}; 
    String address = addressses[0]; //address = "127.0.0.1"; 
    Arrays.sort(addressses); 
    return (addressses[1].equals(address)); 
} 

(있으며, toString() 메서드는 문자열에 사용 된 원래 java toString 메서드를 호출하지 않지만 IPadddress에는 여기에 붙여 넣을 재정의 된 toString() 메서드가 있습니다.

@Override 
public String toString(){ 
    StringBuilder a = new StringBuilder(); 
    for(int i = 0; i < this.address.length -1; ++i){ 
     a.append(this.address[i]).append("."); 
    } 
    a.append(address[address.length-1]); 
    return a.toString(); 
} 

답변

0

내가 제대로 이해한다면, 당신은 IP 문자열은 다음과 같이 작동하지 않습니다와 비교하는 이유를 묻는 :

"2.0.0.127은"와 "10.0.0.127"

대답은 어떤 문자열로 시작하는 것입니다 당신이 비교 될 때, 그래서

: 2 당신이 언급 한 루프 1.

시작 앞에 0으로 IP 문자열을 숫자를 패딩하여 문제의 돌봐 문자열 후 (전적으로) 제공 이러한 문자열 :

"002.000.000.127"및 "010.000.000"127 "

당신거야 (002 010 앞에 오는 것입니다) 예상 된 결과를 얻을 수

이 편집 :. 데이브으로

가 제대로 주석, for 루프의 패딩, 공백 사실 아니다 따라서 비교 된 문자열은 다음과 같이됩니다.

"--2. --- .--- 127"및 "-10. --- .--- 127"
여기서 '-'는 공간.

다행히도, 이것은 같은 비교 결과를 제공합니다. 0으로 채워질 것이다.

+0

네, 이것이 제가 묻고있는 것입니다. 그래서 "2"문자열이 더 많은 문자를 가지고 있기 때문에 "1"인 문자열이 "00"인 문자열 뒤에 자동으로 오는 것을 말하는 것입니까? – user1966576

+0

@ user1966576 예, 두 개의 문자열을 사전 식으로 비교할 때 첫 번째 문자열의 첫 번째 문자와 두 번째 문자열의 첫 번째 문자를 비교 한 다음 두 번째 문자 등도 동일하게 처리합니다. 사전 식 정렬이 동작하기 위해서는 숫자로 된 정렬과 같이 숫자 문자열은 모두 길이가 같아야하므로 0으로 채워야합니다. – Eran

+0

Nitpick : SPACE가 0이 아닌 문자열 왼쪽 패드에 대한 % 3s; 실제로 정수의 경우 % 3d이지만 % 03d는 0을 사용하지만 % 03은 허용되지 않습니다. ASCII 공간은 공백이있는 숫자 문자열이 0과 동일한 (여기서는 올바른) 방법을 비교할 수 있도록 모든 숫자 (및 다른 숫자 아래의 0) 아래에 코딩됩니다. –

0

에 란의 대답은 내 의견은 당신이 당신의 IPAdress 클래스

Comparable을 구현하게 그리고 당신의 adresses 배열의 다른 adresses를 돌봐 당신의 compareTo 메소드를 정의하는 기대이다, 좋다.