2009-02-14 26 views
2

J'ai un tableau multidimensionnel:Comment puis-je retourner les coordonnées/index d'une chaîne dans un tableau multidimensionnel? [Ruby]

foo = [["a","b","c"], ["d", "e", "f"], ["g", "h", "i"]] 

Maintenant je dois ruturn les "coordonnées" de "f", qui devrait être (1,2). Comment est-ce que je peux faire ceci sans savoir quelle "rangée" "f" est dedans? J'ai essayé d'utiliser la méthode d'index, mais cela ne fonctionne que quand je le dis où chercher, à savoir

foo[1].index("f") #=>2 

J'ai essayé quelque chose comme

foo[0..2][0..2].index("f") 

mais renvoie simplement nul.

Est-ce possible?

Répondre

3
foo.each_with_index do |item, index| 
    if item.index('f') 
    // the array number that 'f' is in 
    puts "Array number: #{index}" 
    // the index in that array of the letter 'f' 
    puts item.index('f') 
    end 
end 
1

Vous devrez probablement parcourir les tableaux pour trouver la lettre, puis imprimer l'emplacement.

Il s'agit plus d'un extrait de code général pas réel ruby. Mais le concept est là. Je ne sais pas s'il y a une meilleure façon cependant.

for(int i = 0; i < 3; i++) { 
for(int x = 0; i < 3; x++) { 
    if(foo[i][x] == 'f') { 
    print x, i; 
    } 
} 
} 
0

Vous pouvez utiliser

foo.flatten 

Pour obtenir un tableau aplaties, puis utilisez l'index

4

boucle à travers les index du tableau et retourne le chemin courant lorsque vous trouvez ce que vous voulez . Voici un exemple de méthode:

def find2d(array, elem) 
    array.each_with_index do |row, row_idx| 
    row.each_with_index do |col, col_idx| 
     return [row_idx, col_idx] if col == elem 
    end 
    end 
end 
1

Une autre façon, juste pour l'amusement:

y = nil 
x = (0...foo.size).find {|xi| y = foo[xi].index("f")} 

Le « y = zéro » partie définit juste « y » avant que la boucle pour que vous puissiez le lire la suite ...