3

このクラスを a で使用できるようにComparator、 forを記述する必要があります。アドレスとポートで比較できる必要があります。InetSocketAddressTreeSet

コードは次のようになりますが、問題はアドレスとポートを <(-1),>(1),=(0) で比較する方法がわからないことです

TreeSet<InetSocketAddress> _tree = new TreeSet<InetSocketAddress> 
    (new Comparator<InetSocketAddress>() {

    public int compare(InetSocketAddress o1, InetSocketAddress o2) {

        ///?????
        return 0;
    }
});

編集...実際の質問。InetSocketAddress を比較する方法。

4

5 に答える 5

5

ホスト名が解決されると null になる可能性があるため、InetSocketAddress#getHostName の比較を含むコードは正しくありません。コンストラクターを見てください:

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;
    }
}
于 2011-07-11T01:38:38.157 に答える
1

<(-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 の比較 (利用可能で解決済みの場合) は、より高速になる可能性があります。

于 2011-07-11T00:49:34.740 に答える
1

特定の注文が必要か、何らかの解決策が必要かによって、これが正しい場合があります。

class ISC implements Comparator<InetSocketAddress>
{

@Override
    public int compare(InetSocketAddress o1, InetSocketAddress o2)
    {
        return o1.toString().compareTo(o2.toString());
    }
}
于 2011-07-11T00:55:33.993 に答える
1

CompareToBuilderを使用してみて、 and を渡しgetAddress().getHostAddress()ますgetPort()

于 2011-07-11T00:58:34.160 に答える
1

コンベンションを選択するだけです。

例えば

  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;
于 2011-07-11T01:02:47.737 に答える