2008-12-05 8 views
1

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

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

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

Итак, основная логика я придумал обратный порядок ярлыков, а затем сортирую.

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

В идеале я ищу варианты javascript и java.

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

+1

Err, что случилось с выполнением что вы предлагаете, изменяя порядок строк и сортируя по алфавиту? – Eli 2008-12-05 01:35:04

ответ

0

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

+0

разделение на "." затем соедините «.com.au» и «.co.uk» с «.com» – 2008-12-05 03:21:51

+0

@Bala: Три поля? – some 2008-12-19 10:03:50

0

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

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

1

Я не знаю о 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 
2

на основе Tom's answer ...


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 Development Environment, удобном месте для проверки t фрагменты javascript ...

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"; 
0

Я пришел с этим решением, которое использует 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; 
     } 
    } 
});