[英]Java Comparator for InetSocketAddress
我需要为InetSocketAddress
编写Comparator
以便可以在TreeSet
中使用这个 class 。 它们需要通过地址和端口进行比较。
代码看起来像这样,但问题是我不知道如何通过 <(-1),>(1),=(0) 比较地址和端口
TreeSet<InetSocketAddress> _tree = new TreeSet<InetSocketAddress>
(new Comparator<InetSocketAddress>() {
public int compare(InetSocketAddress o1, InetSocketAddress o2) {
///?????
return 0;
}
});
编辑...实际问题。 如何比较 InetSocketAddress。
InetSocketAddress#getHostName 比较的代码不正确,因为解析主机名时它可能是 null。 看构造函数:
public InetSocketAddress(String hostname, int port) {
if (port < 0 || port > 0xFFFF) {
throw new IllegalArgumentException("port out of range:" + port);
}
if (hostname == null) {
throw new IllegalArgumentException("hostname can't be null");
}
try {
addr = InetAddress.getByName(hostname);
} catch(UnknownHostException e) {
this.hostname = hostname;
addr = null;
}
this.port = port;
}
仅使用 IP 的代码也不正确 - 主机名可能无法解析。 这应该非常有效:
Integer getIp(InetSocketAddress addr) {
byte[] a = addr.getAddress().getAddress();
return ((a[0] & 0xff) << 24) | ((a[1] & 0xff) << 16) | ((a[2] & 0xff) << 8) | (a[3] & 0xff);
}
public int compare(InetSocketAddress o1, InetSocketAddress o2) {
//TODO deal with nulls
if (o1 == o2) {
return 0;
} else if(o1.isUnresolved() || o2.isUnresolved()){
return o1.toString().compareTo(o2.toString());
} else {
int compare = getIp(o1).compareTo(getIp(o2));
if (compare == 0) {
compare = Integer.valueOf(o1.getPort()).compareTo(o2.getPort());
}
return compare;
}
}
<(-1),>(1),=(0) 需要排序我认为你可以假设排序 - 例如:
public int compare(InetSocketAddress o1, InetSocketAddress o2) {
//TODO deal with nulls
if(o1 == o2){
return 0;
} else {
return o1.toString().compareTo(o2.toString());
}
}
这不是很有效,但它说明了这个想法。 比较 IP(可用时,已解决)可以更快。
根据您是否需要特定订单或某种解决方案,这可能是正确的:
class ISC implements Comparator<InetSocketAddress>
{
@Override
public int compare(InetSocketAddress o1, InetSocketAddress o2)
{
return o1.toString().compareTo(o2.toString());
}
}
尝试使用CompareToBuilder ,并传入getAddress().getHostAddress()
和getPort()
。
你只需要选择一个约定。
例如
为 IP 地址选择任意排序方案。 它只需要始终如一地应用。
显然,点表示法暗示了这样做的一种自然方式,因此您可以将例如 127.0.0.1 分解为 {127, 0, 0, 1} 并将其与另一个例如 {84, 23, 10, 2} 进行比较以明确。
另一种选择是将地址部分转换为长数字并仅比较这些数字。 这是基本的哈希。
为端口号选择任意排序方案。 仅使用数字语义似乎是明智的,例如将端口 55 视为小于端口 999(尽管就 IP 协议而言,这样的语义视图是没有意义的。)
伪代码:
compare (addr1, addr2)
if addr1.host > addr2.host return 1;
else if addr1.host < addr2.host return -1;
if addr1.port > addr2.port return 1;
else if addr1.port < addr2.port return -1;
return 0;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.