假设我具有按字母顺序排序的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