Възможно дублиране:
ruby - Преобразуване между елементи на масив
Аз кодирам плъгин в Google Sketchup с рубини се сблъсках с истински проблем, докато се опитвах да променям различни елементи в масиви, които присъстват в друг масив, всичко това в зависимост от комбинация от потребители.
Имам масив от масиви като:
[["a, "b", c"], ["lol1", "lol2", lol3"], ["so1", "so2", "so3"]]
За комбинация като:
[1, 2, 3]
Изходът трябва да бъде същият:
[["a", "b", "c"], ["lol1", "lol2", "lol3"], ["so1", "so2", "so3"]]
Но за комбинация като:
[2, 1, 3]
Резултатът трябва да бъде:
[["b", "a", "c"], ["lol2", "lol1", "lol3"], ["so2", "so1", "so3"]]
Но за комбинация като:
[3, 2, 1]
Резултатът трябва да бъде:
[["c", "b", a"], ["lol3", "lol2", "lol1"], ["so3", "so2", "so1"]]
Отговори:
2 за отговор № 1ar = [["a, b, c"], ["lol1, lol2, lol3"], ["so1, so2, so3"]]
p maybe_this = ar.map{|sub_ar| sub_ar.first.split(", ")}
#[["a", "b", "c"], ["lol1", "lol2", "lol3"], ["so1", "so2", "so3"]]
idx = [2,1,3]
#indexing of an array is zero-based
p idx.map!{|i| i-1} #[1,0,2]
p res = maybe_this.map{|sub_ar| sub_ar.values_at(*idx)}
#[["b", "a", "c"], ["lol2", "lol1", "lol3"], ["so2", "so1", "so3"]]
Историята: values_at Методът приема множество аргументи; *idx
пръскане на масив в множество аргументи.
1 за отговор № 2
Може би искате това:
perm_idx = [1,2,3].permutation.to_a.index([2,3,1])
[["a", "b", "c"], ["lol1", "lol2", "lol3"], ["so1", "so2", "so3"]].map {|x| x.permutation.to_a[perm_idx] }
0 за отговор № 3
Не е съвсем сигурен какво искате, но това може да работи за вас:
a = [["a, b, c"], ["lol1, lol2, lol3"], ["so1, so2, so3"]]
def combi_with_join(ordering, arrays)
ordering = ordering.map {|x| x - 1}
arrays.map {|ar| [ar.first.split(/,s*/).values_at(*ordering).join(", ")] }
end
puts combi_with_join([1, 2, 3], a).inspect
puts combi_with_join([2, 1, 3], a).inspect
puts combi_with_join([3, 2, 1], a).inspect
ако всъщност искате масив от масиви ...
def combi(ordering, arrays)
ordering = ordering.map {|x| x - 1}
arrays.map {|ar| ar.first.split(/,s*/).values_at(*ordering) }
end
puts combi([1, 2, 3], a).inspect
puts combi([2, 1, 3], a).inspect
puts combi([3, 2, 1], a).inspect