Сортировка доменных имен - PullRequest
       9

Сортировка доменных имен

1 голос
/ 05 декабря 2008

Кто-нибудь реализовал сортировку списка доменных имен?

Я видел, как некоторые приложения сортировали их как плоские строки, но проблема в том, что вы разбрасываете все связанные хосты в домене:

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

Итак, основная логика, которую я придумал, - это изменить порядок меток, а затем отсортировать.

Полные доменные имена одной метки должны рассматриваться как имена хостов и, вероятно, сортироваться отдельно, может быть, вверху.

В идеале я ищу javascript и java версии.

Я также не знаю, подходит ли этот дизайн для новых интернационализированных доменных имен.

Ответы [ 6 ]

2 голосов
/ 05 декабря 2008

На основании ответа Тома ...


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]);

Операторы печати работают (без комментариев) в среде разработки SquareFree JavaScript , удобном месте для тестирования фрагментов JavaScript ...

1 голос
/ 24 января 2011

Вот как это делается в 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";
1 голос
/ 05 декабря 2008

Я не знаю, в частности, о Java и Javascript, но многие языки предоставляют некую структуру данных массива, которая может быть отсортирована лексикографически Итак, как вы сказали, преобразуйте «a.example.com» в {«com», «example», «a»} и просто запустите стандартные правила сортировки. Лексикографическая сортировка будет делать то, что вы хотите.

Если у вас есть список локальных доменов, а также полные доменные имена, я согласен, что вы захотите выделить их. Все, что не имеет периода, может быть отфильтровано первым. Или вы можете разрешить их все до полного доменного имени, а затем просто отсортировать весь список.

Некоторый код 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
0 голосов
/ 18 мая 2017

Я придумал это решение, которое использует генераторы Array.prototype.sort () и ES6:

function* reverseIterateParts(domain) {
    let currentEnd = domain.length;
    for (let index = currentEnd-1; index >= -1; index--) {
        if (index == -1 || domain[index] == '.') {
            yield domain.substring(index + 1, currentEnd);
            currentEnd = index;
        }
    }
}

arrayOfDomainNames.sort((domainA, domainB) => {
    let partsOfA = reverseIterateParts(domainA);
    let partsOfB = reverseIterateParts(domainB);
    while (true) {
        let partA = partsOfA.next();
        let partB = partsOfB.next();

        if (partA.done) {
            if (partB.done) {
                return 0;
            }
            return -1;
        }
        if (partB.done) {
            return 1;
        }
        if (partA.value > partB.value) {
            return 1;
        }
        if (partA.value < partB.value) {
            return -1;
        }
    }
});
0 голосов
/ 05 декабря 2008

Это результат войны с прямым порядком байтов против прямой последовательности в начале 80-х, в которой победила команда с прямым порядком байтов. В Великобритании доменные имена первоначально заказывались как (гипотетически) «uk.ac.leeds» для британского «академического» (Университета) Лидса. Это порядок с прямым порядком байтов - и делает ваш вид намного проще. Также было бы намного сложнее подделать интернет-сайты в URL. Конечно, в настоящее время порядок имеет порядок байтов, а гипотетический URL будет «leeds.ac.uk».

Для разумной сортировки связанных доменных имен вы должны будете добиться эффекта сортировки сначала по крайнему правому компоненту (.com, .uk, .org), а затем по следующему левому и повторите ... как сказал @Bala), вам придется сделать что-то похожее на разбиение имен и сортировку справа налево.

0 голосов
/ 05 декабря 2008

Вы можете разделить доменные имена на отдельные поля и выполнять последовательные сортировки. Вы можете создать объект доменного имени с тремя полями и создать список доменных имен для сортировки. Для каждого из трех полей выполните сортировку. В конце у вас есть список сортировки доменных имен со связанными хостами вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...