假设我具有按字母顺序排序的id(key)和country(values)哈希,那么将条目冒泡到堆栈顶部的最佳方法是什么?

时间:2020-03-05 18:47:46  来源:igfitidea点击:

这是一个php示例,但是适用于任何语言的算法都可以。我特别想做的是使美国和加拿大跻身榜首。这是为简洁起见而缩短的数组的示例。

array(
  0 => '-- SELECT --',
  1 => 'Afghanistan',
  2 => 'Albania',
  3 => 'Algeria',
  4 => 'American Samoa',
  5 => 'Andorra',)

该ID需要保持原样。因此,不幸的是使它们为-1或者-2无效。

解决方案

回答

在类似情况下,我的捷径是在加拿大开头添加一个空格,在美国开头添加两个空格。如果将这些显示为SELECT标记中的选项,则空格不可见,但排序仍将其置于最前面。

但是,在某些情况下,这可能有点麻烦。在Java中,要做的是扩展StringComparator,重写美国和加拿大特殊情况的compare()方法,然后对传入新比较器作为排序算法的列表(或者数组)进行排序。

但是我想想可能只是在数组中找到相关条目,将它们从数组中删除,然后在开始时再次添加它们会更简单。如果我们处于某种可以对数组重新排序的框架中,则可能无法正常工作。但在大多数情况下,这样做就可以了。

[编辑]我看到我们使用的是哈希而不是数组,所以这将取决于排序方式。我们能否简单地将美国放入带有键-2的散列中,将加拿大放入-1的散列中,然后按ID排序?我已经11年没有使用PHP了,我不记得它是否在哈希表中内置了排序功能,或者我们是否在应用程序级别上进行了排序。

回答

在这些情况下,我通常要做的是添加一个名为DisplayOrder或者类似内容的单独字段。一切默认情况下都是1,然后按DisplayOrder和Name排序。如果我们希望列表中的内容更高或者更低,则可以相应地调整显示顺序,同时保持原样的正常ID。

-凯文·费尔柴尔德(Kevin Fairchild)

回答

$a = array(
    0 => '- select -',
    1 => 'Afghanistan',
    2 => 'Albania',
    3 => 'Algeria',
    80 => 'USA'
);

$temp = array();
foreach ($a as $k => $v) {
    $v == 'USA'
        ? array_unshift($temp, array($k, $v))
        : array_push($temp, array($k, $v));
}
foreach ($temp as $t) {
    list ($k, $v) = $t;
    echo "$k => $v\n";
}

输出为:

80 => USA
0 => - select -
1 => Afghanistan
2 => Albania
3 => Algeria