根据元素的频率对整数数组进行排序。如果两个元素的频率相同,则它们将以升序打印

时间:2019-07-03 13:40:31

标签: php algorithm sorting

例如,输入数组为[9,1,9,1,3,9,1,2,9]输出数组将为[9,9,9,9,1, 1,1,2,3]。

这是我在下面尝试过的,但没有给我预期的结果:

$array = [9,1,9,1,3,9,1,2,9];
$values = array_count_values($array);
arsort($values);
$popular = array_keys($values);

print_r(array_values($popular));

foreach ($values as $key => $val) {
    echo $key.", ";
}

输出:

Array
(
    [0] => 9
    [1] => 1
    [2] => 3
    [3] => 2
)
9, 1, 3, 2,

3 个答案:

答案 0 :(得分:1)

如果我们循环array_count_values,那么我们可以确保它们以正确的顺序出现。
当有两个计数相同时,我发现array_intersect的计数相同,然后将它们foreach并按正确的顺序添加。

-----BEGIN OPENSSH PRIVATE KEY-----

https://3v4l.org/sk44Q

答案 1 :(得分:0)

尝试将usort与array_count(php> = 7.0)结合使用:

val item = rVComments.findViewHolderForItemId(mAdapter.itemId)!!.itemView
val adapt = item.rVReplies.adapter as ChildCommentsAdapter
adapt.addComment(it.data.comment)

答案 2 :(得分:0)

您可以使用以下顺序:

$arrayCounts = array_count_values($array);
usort($array, function ($a, $b) use ($arrayCounts) {
    return $arrayCounts[$b] - $arrayCounts[$a] ?: $a - $b; 
});

现在$array已按要求排序。

当两个元素usort$a保持该顺序(从左到右)时,作为参数传递给$b的回调函数应返回负数,或者当它们应该颠倒时为正数。没关系的时候为0。

在此特定的回调函数中返回的数字表达式减去$a$b的频率。如果$b发生更多,则该减法为正,然后返回。同样,如果减法为负,则返回该负值。现在,当频率相等时,?: operator会加入,并对其后的表达式求值。基于原始值本身,其他减法也会导致正值或负值。因此,$a - $b$a < $b时为负,这意味着顺序可以保持原样(知道我们已经得出它们的频率相等)。