簡體   English   中英

JAVA:按字典順序比較兩個字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM