这是我在这里的第一个问题,对不起,如果在发布此消息时遇到任何错误。
我正在尝试根据其值拆分数组。基本上,我想创建两个数组,其值尽可能接近平均值。我设法用以下代码做到了这一点:
function Sum($v) {
[Linq.Enumerable]::Sum([int64[]]$v)
}
$arr = 0..9 | % {get-random -min 1 -max 10}
"ARRAY:" + $arr
"SUM: " + (sum $arr)
"AVG: " + (sum $arr)/2
# start of the code that matters
$wavg = (sum $arr)/2
foreach ($i in (0..($arr.Count-1))) {
$wavg -= $arr[$i]
if ($wavg -le 0) {
$i-=(-$wavg -gt $arr[$i]/2);break
}
}
"SPLIT INDEX: " + $i
"ARR1: " + $arr[0..$i] + " (" + $(sum $arr[0..$i]) + ")"
"ARR2: " + $arr[($i+1)..$arr.Count] + " (" + $(sum $arr[($i+1)..$arr.Count]) + ")"
我的foreach
这样构成的原因是,在我的实际代码中,值位于索引哈希中,并且可以作为$index[$arr[$i]]
进行访问。
这意味着生成的两个数组的大小可能不相等(如果将数组分成两半,这很容易)。我的代码示例输出来证明这一点:
ARRAY: 5 3 6 3 2 3 6 3 1 3 SUM: 35 AVG: 17.5 SPLIT INDEX: 3 ARR1: 5 3 6 3 (17) ARR2: 2 3 6 3 1 3 (18)
代码按原样工作,但我认为可以用更优雅,更快捷的方式来完成。因为我需要在脚本中执行数千次此代码,所以我希望它尽可能快。