2014-11-04 66 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