我正在參加一所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();
}
是的,這正是我所問的。所以你說一個字符串是「1」後自動出現在字符串「00」之後,因爲第二個字符串有更多的字符? – user1966576 2014-10-29 10:34:14
@ user1966576是的,當按字典順序比較兩個字符串時,將第一個字符串的第一個字符與第二個字符串的第一個字符進行比較,然後對第二個字符進行相同操作......等等。像數字排序,兩個數字字符串必須具有相同的長度,所以它們應該填充零。 – Eran 2014-10-29 10:39:36
Nitpick:帶SPACE的字符串左鍵不爲零時的%3s;實際上,整數的%3d也是如此,但%03d使用零,而%03s是不允許的。 ASCII空間的編碼低於所有數字(零低於其他數字),因此帶空格的數字字符串與零相同(以及正確)的方式。 – 2014-10-29 11:35:26