[英]JAVA: Lexicographically comparing two Strings
我正在一所IT學校上學,我們才剛剛開始學習JAVA,我們必須做一個項目,在具有IP地址的節點網絡中傳遞一種模擬的簡單“消息”。
就此問題而言,整個項目並不重要。
我們有一個IPAddress類,其方法之一是比較三個IP地址對象,並確定第一個是否在其他兩個的“范圍內”。
例如,讓我們在系統中有一個Node,將其命名為N1(有一個完整的節點類,但是那不是很重要的atm),並有一個帶有消息“ Hello”的包(也是它自己的類)。
程序包的IP地址為127.0.0.1
系統希望將其傳遞到N1,該N1具有某個IP地址(無關)和一個IP地址范圍(顯示其處理的IP范圍)。
127.0.0.0(下限)和127.0.0.255(上限)
IPAddress類InsideRange方法接收兩個IP作為參數,通過以下方式將其與第三個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。
我沒有編寫上面的代碼,但是我請一個朋友來幫助我。 原因是我的版本無法正常工作(對於超出下限或上限的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循環
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();
}
如果我理解正確,您在問為什么比較像這樣的IP字符串不起作用:
“ 2.0.0.127”和“ 10.0.0.127”
答案是,任何以2開頭的字符串(按字典順序)都在以1開頭的字符串之后。
您提到的for循環通過將使IP字符串以前導零填充的數字來解決此問題:
因此,當您比較這些字符串時:
“ 002.000.000.127”和“ 010.000.000.127”
您將獲得預期的結果(即002在010之前)。
編輯:
正如Dave正確評論的那樣,for循環中的填充實際上是使用空格而不是零,因此比較的字符串變為:
“ --2 .---..--。127”和“ -10 .---.---。127”
其中“-”代表SPACE。
幸運的是,這提供了與零填充相同的比較結果。
Eran的回答很好,我的觀點是,您希望使IPAdress類實現可比性。
並定義您的compareTo方法以處理地址數組中的不同地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.