簡體   English   中英

Java InetSocketAddress 比較器

[英]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()

你只需要選擇一個約定。

例如

  1. 為 IP 地址選擇任意排序方案。 它只需要始終如一地應用。

    顯然,點表示法暗示了這樣做的一種自然方式,因此您可以將例如 127.0.0.1 分解為 {127, 0, 0, 1} 並將其與另一個例如 {84, 23, 10, 2} 進行比較以明確。

    另一種選擇是將地址部分轉換為長數字並僅比較這些數字。 這是基本的哈希。

  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM