代码之家  ›  专栏  ›  技术社区  ›  community wiki benc

域名排序

  •  1
  • community wiki benc  · 技术社区  · 7 年前

    有人对域名列表进行过排序吗?

    我见过一些应用程序将它们排序为扁平字符串,但问题是最终会将所有相关主机分散在一个域中:

    a、 我。通用域名格式 a、 你。通用域名格式 b、 我。通用域名格式 b、 你。通用域名格式

    所以,我提出的基本逻辑是颠倒标签的顺序,然后排序。

    一个标签的FQDN应被视为主机名,并且可能单独排序,可能在顶部。

    理想情况下,我正在寻找javascript和java版本。

    我也不知道这种设计是否适用于较新的国际化域名。

    6 回复  |  直到 17 年前
        1
  •  2
  •   Tom    17 年前

    我对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
  •  2
  •   Stobor    9 年前

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

    print语句(未注释时)在 SquareFree JavaScript Development Environment ,一个测试javascript片段的方便地方。。。

        3
  •  1
  •   Jonathan Leffler    17 年前

    这是80年代早期的大恩迪安对小恩迪安战争的结果,小恩迪安队赢得了这场战争。在英国,域名最初是按(假设的)“UK”排序的。ac.leeds代表英国“学术”(利兹大学)。这是big endian排序,使排序更容易。这也将使在URL中欺骗互联网网站变得更加困难。当然,现在的顺序是little endian,假设的URL是“leeds”。ac.uk'。

    为了合理地将相关域名排序在一起,您必须先按最右边的组件(.com、.uk、.org)排序,然后按下一个左边的组件排序,然后重复。。。换句话说(正如@Bala所说),你必须做一些类似于将名字拆分并从右到左排序的事情。

        4
  •  1
  •   cmanley_nl    15 年前

    在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";
    
        5
  •  0
  •   Bala    17 年前

    您可以将域名拆分为单独的字段,并进行连续排序。您可以创建一个域名对象来包含三个字段,并创建一个要排序的域名列表。对这三个字段中的每一个进行排序。最后,你有一个域名的排序列表和相关的主机一起。

        6
  •  0
  •   simomat    9 年前

    我想出了这个利用阵列的解决方案。原型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;
            }
        }
    });