2014-10-29 103 views
0

我正在參加一所IT學校,我們剛開始學習JAVA,我們不得不做一個模擬的簡單「消息」,通過具有IP地址的節點網絡傳遞。JAVA:按字母順序比較兩個字符串

對於這個問題,整個項目並不重要。

我們有一個IPAddress類,它的一個方法是比較三個IP地址對象,並決定第一個IP地址對象是否在其他兩個「範圍內」。

例如,讓我們在系統中有一個節點,稱之爲N1(有一個完整的節點類,但這是不重要的atm),並有一個包(也是它自己的類),其中包含消息「Hello」。

包裝上有127.0.0.1

系統想要將它傳遞到N1擁有的東西(無關)和IP地址範圍(這說明哪些IP的範圍內做一個IP地址的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是INSIDE 127.0.0.0和127.0.0.255,所以它返回true。

但是,我沒有做出上面的代碼,我問朋友幫我。其原因是,我的版本沒有正常工作(它的IP是的下限或上限之外有時返回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) 

我的問題是,爲什麼不是我的工作嗎?和:

這是什麼做的一部分,爲什麼是在所有

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]); 
} 

需要循環,如果我只是去爲什麼沒有工作:

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

的開始for循環你提到的通過填充,使該IP串前導零的數字需要照顧的問題之後的字符串:

所以,當你在比較這些字符串:

「002.000.000.127」和「010.000.000。127"

你會得到預期的結果(這是002自帶010之前)

編輯:

戴維正確評價,在for循環填充實際上是帶有空格,不0,所以比較的字符串變成:

「-2。--- .--- 127」和「-10。--- .-- 127」
其中' - '代表SPACE

幸運的是,這給出了與用零填充會填充。

+0

是的,這正是我所問的。所以你說一個字符串是「1」後自動出現在字符串「00」之後,因爲第二個字符串有更多的字符? – user1966576 2014-10-29 10:34:14

+0

@ user1966576是的,當按字典順序比較兩個字符串時,將第一個字符串的第一個字符與第二個字符串的第一個字符進行比較,然後對第二個字符進行相同操作......等等。像數字排序,兩個數字字符串必須具有相同的長度,所以它們應該填充零。 – Eran 2014-10-29 10:39:36

+0

Nitpick:帶SPACE的字符串左鍵不爲零時的%3s;實際上,整數的%3d也是如此,但%03d使用零,而%03s是不允許的。 ASCII空間的編碼低於所有數字(零低於其他數字),因此帶空格的數字字符串與零相同(以及正確)的方式。 – 2014-10-29 11:35:26

0

伊蘭的回答是不錯的,我的意見是,你期望使你的IPAdress類實現Comparable

,並定義compareTo方法,以照顧不同的不會忽略你不會忽略陣列。