我正在参加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();
}
答案 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方法来处理你的地址数组中的不同地址。