2014-10-29 77 views
0

我正在参加一所IT学校,我们刚开始学习JAVA,我们不得不做一个模拟的简单“消息”,通过具有IP地址的节点网络传递。JAVA:按字母顺序比较两个字符串

对于这个问题,整个项目并不重要。

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

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

包装上有127.0.0.1

系统想要将它传递到N1拥有的东西(无关)和IP地址范围(这说明哪些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是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 (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

如果我理解正确的,你会问,为什么IP比较之类的字符串,这些不工作:

“2.0.0.127”和“10.0.0.127”

答案是,与开始的字符串2来自(按字典),与1

的开始for循环你提到的通过填充,使该IP串前导零的数字需要照顾的问题之后的字符串:

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

“002.000.000.127”和“010.000.000。127"

你会得到预期的结果(这是002自带010之前)

编辑:

戴维正确评价,在for循环填充实际上是带有空格,不0,所以比较的字符串变成:

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

幸运的是,这给出了与用零填充会填充。

+0

是的,这正是我所问的。所以你说一个字符串是“1”后自动出现在字符串“00”之后,因为第二个字符串有更多的字符? – user1966576 2014-10-29 10:34:14

+0

@ user1966576是的,当按字典顺序比较两个字符串时,将第一个字符串的第一个字符与第二个字符串的第一个字符进行比较,然后对第二个字符进行相同操作......等等。像数字排序,两个数字字符串必须具有相同的长度,所以它们应该填充零。 – Eran 2014-10-29 10:39:36

+0

Nitpick:带SPACE的字符串左键不为零时的%3s;实际上,整数的%3d也是如此,但%03d使用零,而%03s是不允许的。 ASCII空间的编码低于所有数字(零低于其他数字),因此带空格的数字字符串与零相同(以及正确)的方式。 – 2014-10-29 11:35:26

0

伊兰的回答是不错的,我的意见是,你期望使你的IPAdress类实现Comparable

,并定义compareTo方法,以照顾不同的不会忽略你不会忽略阵列。