1

ドメイン名のリストのソートを実装した人はいますか?

一部のアプリケーションがそれらをフラット文字列としてソートするのを見てきましたが、問題は、ドメイン内の関連するすべてのホストが分散してしまうことです。

a.me.com a.you.com b.me.com b.you.com

したがって、私が思いついた基本的なロジックは、ラベルの順序を逆にして並べ替えます。

1 つのラベルの FQDN はホスト名として扱われるべきであり、おそらく一番上に別々にソートされるべきです。

理想的には、JavaScript と Java のバージョンを探しています。

また、この設計が新しい国際化ドメイン名でうまく機能するかどうかもわかりません。

4

6 に答える 6

2

特に Java と Javascript については知りませんが、多くの言語では、辞書順にソートできるある種の配列データ構造が提供されています。したがって、あなたが言ったように、「a.example.com」を {"com", "example", "a"} に変換し、デフォルトの並べ替えルールを実行させます。辞書式ソートは、まさにあなたが望むことを行います。

ローカル ドメインと FQDN のリストがある場合は、それらを分離したいという意見に同意します。ピリオドが含まれていないものはすべて、最初に除外できます。または、それらすべてを FQDN に解決してから、リスト全体を並べ替えることができます。

これを行ういくつかの Python コード (Javascript にかなり厳密にマップする必要があります):

hosts = ["a.foo.com", "b.foo.com", "foo.com", "c.bar.com"]

split_hosts = []
for h in hosts:
    segments = h.split('.')
    segments.reverse()
    split_hosts.append(segments)

split_hosts.sort()
for segments in split_hosts:
    segments.reverse()
    print ".".join(segments)

これは以下を出力します:

c.bar.com
foo.com
a.foo.com
b.foo.com
于 2008-12-05T01:38:23.957 に答える
2

トムの答えに基づいて...


hosts = new Array( "a.foo.com", "b.foo.com", "foo.com", "c.bar.com" );

//print("Unsorted:");
//for (host in hosts )
//     print(hosts[host]);

sorted_hosts = new Array();
split_hosts = new Array();

for(h in hosts)
{
    segments = hosts[h].split('.');
    segments.reverse(); 
    split_hosts.push(segments);
}

split_hosts.sort()

for(h in split_hosts)
{
    split_hosts[h].reverse()
    sorted_hosts.push(split_hosts[h].join("."))
}

//print("Sorted:");
//for (host in sorted_hosts )
//     print(sorted_hosts[host]);

print ステートメントは、SquareFree JavaScript 開発環境(コメントを外した場合) で機能します。これは、javascript フラグメントをテストするのに便利な場所です...

于 2008-12-05T02:50:55.603 に答える
1

これは、リトルエンディアンチームが勝利した80年代初頭のビッグエンディアン対リトルエンディアン戦争の結果です。英国では、ドメイン名は当初、英国の「アカデミック」(大学) リーズの (架空の) 「uk.ac.leeds」のように並べられていました。これはビッグエンディアンの順序付けであり、並べ替えがはるかに簡単になります。また、URL でインターネット サイトを偽装することもはるかに難しくなります。もちろん、今日では順序はリトルエンディアンであり、架空の URL は「leeds.ac.uk」になります。

関連するドメイン名を適切に並べ替えるには、最初に最も右のコンポーネント (.com、.uk、.org) で並べ替え、次に左の次の要素で並べ替えるという効果を達成する必要があります... 言い換えれば (@Bala として)と言った)、名前を分割して右から左に並べ替えるのと同様のことを行う必要があります。

于 2008-12-05T01:31:07.840 に答える
1

これは、Perl で行う方法です。

#!/usr/bin/perl -w
use strict;

my @hosts = qw(
 bar.org
 a.foo.com
 b.foo.com
 foo.com
 c.bar.com
);

print join("\n", sort {
 $a = lc($a);
 $b = lc($b);
 if ($a eq $b) {
  return 0;
 }
 my @a = reverse(split(/\./, $a));
 my @b = reverse(split(/\./, $b));
 my $max = (scalar(@a), scalar(@b))[@a < @b];
 for (my $i=0; $i < $max; $i++) {
  if (($i < @a) && ($i < @b)) {
   if (my $c = $a[$i] cmp $b[$i]) {
    return $c;
   }
  }
  else {
   return scalar(@a) <=> scalar(@b);
  }
 }
 return 0;
} @hosts) . "\n";
于 2011-01-24T19:02:28.140 に答える
0

ドメイン名を個々のフィールドに分割し、連続して並べ替えることができます。3 つのフィールドを持つドメイン名オブジェクトを作成し、並べ替えるドメイン名のリストを作成できます。3 つのフィールドのそれぞれについて、並べ替えを行います。最後に、関連するホストをまとめたドメイン名のソート リストがあります。

于 2008-12-05T01:24:00.583 に答える