0

我正在上一所 IT 学校,我们刚开始学习 JAVA,我们必须做一个项目,模拟简单的“消息”在具有 IP 地址的节点网络中传递。

就这个问题而言,整个项目并不重要。

我们有一个 IPAddress 类,它的一个方法是比较三个 IP 地址对象并判断第一个是否在另外两个的“范围内”。

例如,让我们在系统中有一个节点,将其命名为 N1(有一个完整的节点类,但这并不重要),并有一个包含“Hello”消息的包(也是它自己的类)。

该软件包的 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 位于 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(); 
}
4

2 回答 2

0

如果我理解正确,您会问为什么比较这些 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”
其中“-”代表空格。

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

于 2014-10-29T10:32:00.823 回答
0

Eran 的回答很好,我的观点是你希望让你的 IPAdress 类实现Comparable

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

于 2014-10-29T10:34:28.267 回答