2014-11-04 64 views
-2
  1. 我存储一些值的阵列在如下$得分[$ userIndex] =:

Score [100, 400, 900]排序和阵列保持索引值

userIndex (1 , 2 , 3)

我需要数字升序排序基于分数同时保持指标,因为它们有意义,结果应该类似于:

Score [100, 400, 900] 
userIndex (2 , 1 , 3) 

2.排序完成后,如何访问元素所在的前一个索引(在排序完成后,我不再需要分数就是索引)? 在排序的阵列中的所有我需要的是如:$sorted[0] = 2, $sorted[1] = 1, $sorted[3] = 3

+0

我真的不明白你在做什么,但:排序到一个新的数组?然后你有旧的和新的阵列可用... – 2014-11-04 08:19:27

+0

@TedBear我需要根据得分排序到基于第一个数组的'Score'字段的新数组中。排序后,我需要的是'Score'在第一个数组中的索引。我想最终得到的数组基本上是[2,1,3],因为'Score'在第一个数组的索引中 – Anon957 2014-11-04 08:28:22

+0

我认为你的意思是你的@ score数组是'(400,100 ,900)'。它已经按照你的问题进行了排序。 – Borodin 2014-11-04 11:40:42

回答

0

我发现做了一些广泛使用Google

while ($hashIndex < $#Score) { 
    $matchHash{$hashIndex} = $Score[$hashIndex]; 
    $hashIndex++; 
} 

foreach my $score (sort { $matchHash{$a} <=> $matchHash{$b} } keys %matchHash) { 
    #DS 
     # printf "%-8s %s\n", $score, $matchHash{$score}; 
    push (@sorted, $score); 

} 
+0

您正在有效地将数组信息复制到散列表中,出于两个原因,这是一个糟糕的主意。首先,散列意图通过字符串而不是数字来索引,其次,重复信息没有意义 - 您的“排序”调用可以直接使用“@ Score”数组。 – Borodin 2014-11-04 11:51:13

0

以后的路要做到这一点是要排序的数组索引列表的这种方法而不是数据本身。然后,您可以使用相同的排序索引重新排序相应的用户列表。

的代码看起来像这样

use strict; 
use warnings; 

my @score = (400, 100, 900); 
my @users = (1, 2, 3); 

my @sorted_indices = sort { $score[$a] <=> $score[$b] } 0 .. $#score; 

my @sorted_users = @users[@sorted_indices]; 

print "@sorted_users\n"; 

输出

2 1 3 

更新

看你自己的代码,它看起来像也许你想要的是排序数组索引,(即您的问题中的userIndex列表应正确为(0, 1, 2))。如果是这种情况,则在填充@sorted_indices时排序完成。

print "@sorted_indices\n"; 

输出

1 0 2