2016-06-23 4 views
-1

Wenn es ein Array istFinden Sie den Index nach aktuellen Sortierreihenfolge eines Arrays in Ruby

array A = ["a","b","c","d"] #Index is [0,1,2,3] 

Und es sortiert.

array A = ["d","c","b","a"] 

Ich brauche ein Array, das mir den aktualisierten Index auf der sortierten Reihenfolge basierte gibt

[3,2,1,0] 

Ich versuche, eine Lösung für diesen rubin

UPDATE auf die Frage zu finden

Wenn a nach

sortiert wird
array A = ["d","b","c","a"] #not a pure reverse 

Dann sollte der zurück Index Array

[3,1,2,0] 
+0

Willkommen bei SO in object_id Werte im Wandel führt. Bitte lesen Sie "[fragen]". Wir würden gerne Ihre Bemühungen sehen, das Problem zu lösen. Hast du Code geschrieben? Wenn ja, lesen Sie "[mcve]". Wir schreiben keinen Code für Sie, aber wir helfen Ihnen, Ihren Code zu reparieren. –

Antwort

5

Sie benötigen eine Zuordnungstabelle zu erstellen, die die ursprüngliche Reihenfolge beibehalten, dann diese nutzen, um un-Karte die neugeordneten Version:

orig = %w[ a b c d ] 
orig_order = orig.each_with_index.to_h 

revised = %w[ d c b a ] 

revised.map { |e| orig_order[e] } 
# => [3, 2, 1, 0] 

Solange Ihre Elemente einzigartig sind, kann dies jede Verschiebung in der Reihenfolge verfolgen.

0

Sie können die Methoden map und index verwenden.

arr = ["a","b","c","d"] 

sort_arr = ["d","c","b","a"] 

sort_arr.map{|s| arr.index(s)} 
# => [3, 2, 1, 0] 
+0

Gute, einfache Lösung, könnte aber leistungsmäßig aus dem Ruder laufen, wenn das Array groß wird. Was passiert, wenn ein dupliziertes Element im Array vorhanden ist und was ist das gewünschte Verhalten? –

+0

@AndrewSchwartz Ja, es könnte Performace Probleme geben, wenn die Anordnung in diesem Fall groß ist, bekommt, wird recoment ich einige 'Hash' Art und Weise zu nutzen. Duplizierte Elemente sind ein Problem, aber die Antwort gibt das Verhalten in diesem Fall nicht an. –

0

Hier ist ein Weg, dies zu tun:

original_array = ["a","b","c","d"] 
jumbled_array = original_array.shuffle 

jumbled_array.map {|i| original_array.index(i)} 
#=> [1, 3, 0, 2] 

Hinweis:

  1. In diesem Beispiel wird der Ausgang für jeden Lauf ändern, wie wir shuffle verwenden das zu demonstrieren, Lösung.
  2. Die Lösung funktioniert nur solange das Array keine doppelten Werte hat.

Wenn Sie Lösung mit Arrays mit doppelten Werten wollen, dann zu arbeiten, ist eine Möglichkeit, bei object_id von Gruppenmitgliedern zu suchen, während der Index herauszufinden.

jumbled_array.map {|i| original_array.map(&:object_id).index(i.object_id)} 

Diese Lösung wird so lange arbeiten, wie jumbled_array Element aus original_array enthält und es wurden keine Elemente mit dup oder etwas neu erstellt, die

Verwandte Themen