JAVA:按字典顺序比较两个字符串

时间:2014-10-29 10:25:12

标签: java string lexicographic

我正在参加IT学校,我们刚刚开始学习JAVA,我们不得不做一个模拟简单"消息的项目。被传递到具有IP地址的节点网络。

对于这个问题,整个项目无关紧要。

我们有一个IPAddress类,它的一个方法是比较三个IP地址对象,并决定第一个是否在#34;范围内"其他两个。

例如,让我们在系统中有一个Node,称之为N1(有一个完整的节点类,但那不重要的atm)并且有一个包(也是它自己的类)和消息"你好"在它。

包的IP地址为127.0.0.1

系统希望将其传递给N1,其中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 IS 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循环

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

2 个答案:

答案 0 :(得分:0)

如果我理解正确,你会问为什么比较像这样的IP字符串不起作用:

“2.0.0.127”和“10.0.0.127”

答案是任何以2开头的字符串在以1开头的字符串之后(按字典顺序)出现。

你提到的for循环通过填充使IP字符串带有前导零的数字来解决问题:

所以,当你比较这些字符串时:

“002.000.000.127”和“010.000.000.127”

您将获得预期结果(即002之前的002)。

编辑:

正如Dave正确评论的那样,for循环中的填充实际上是SPACE,而不是零,所以比较的字符串变为:

“ - 2。--- .---。127”和“-10。--- .---。127”
其中' - '代表SPACE。

幸运的是,这给出了与零填充相同的比较结果。

答案 1 :(得分:0)

Eran回答很好,我的意见是你希望让你的IPAdress课程实现Comparable

并定义你的compareTo方法来处理你的地址数组中的不同地址。