JavaFree.org | RubyOnBr.org

Acessando "iterados"?

Acompanhar Acessando "iterados"? 9 posts, 3 participantes

Avatar nofxx 1960 posts

Sendo @points uma array [ponto1, ponto2, ponto3] pra calcular a distancia desta “linha”:

Eh necessario fazer distancia(ponto1 a ponto2) + distancia(ponto2 a ponto3).

reduce(0) seria o certo nao? Mas como acessar o “next” da interation?

 
Avatar Fernando Luizão 1863 posts

Pelo que sei, conceitualmente o reduce trabalha sobre um único elemento de cada vez. Mas no seu caso, vc precisa do próximo elemento para o cálculo, e acho que o inject não permite isso. Não sei se é aplicável ao seu caso, mas talvez delegar o cáluclo para outra classe seja uma boa solução.

 
Avatar nofxx 1960 posts

Eh, exatamente o dilema… eu tenho que acessar o “proximo”.
Pensei em algo do tipo, tipo:

def calcula_dois(um, dois)
um.distancia_de(dois)
end

dae eu envio os pares 1 e 2, 2 e 3, 3 e 4 .. etc

 
Avatar Fernando Luizão 1863 posts

Acho que assim vc só desvia do problema ;). Talvez uma solução bacana seja vc criar uma classe para lidar com tudo isso. Ela poderia “esconder” o seu array, e fazer tudo que vc espera da sua estrutura. Por exemplo:


class Linha < Array
def distancia
total = 0
each_with_index do |point, i|
total = point.spherical_distance(self[i1]) if self[i+1]
end
end

… outros metodos relacionados a linha

end


Não sei se é uma solução adequada ao seu caso (até pq herdar de array vai te deixar amarrado), mas talvez seja útil caso mais responsabilidades possam ser atribuídas a essa classe.

 
Avatar nofxx 1960 posts

Isso ateh funciona, nem precisa herdar da array ( tás esquecendo mixins? =D )eh soh dar um include Enumerable.
Mas no caso aqui nem eh necessario pq self da LineString ja retorna a array points =D

Na verdade soh muda o final, de @points pra self .

 
Avatar Fernando Luizão 1863 posts

A herança foi por pura preguiça, só pra ganhar as sobrecargas de operadores e outros métodos úteis da array para manipular os pontos da linha =). Não sei se entendi direito seu problema, mas eu tinha visualizado algo como:

l = Linha.new
l << [1, 2, 3]
l << [4, 5, 6]
l << [7, 8, 9]
l.distancia

É isso mesmo?

 
Avatar nofxx 1960 posts

Linha tem um array @points. Ela eh soh isso na vdd.

@linha = Linha.from_points([[1,1][2,2][3,3]])

@linha.points.length
=> 3

@linha.distancia_em_metros
=> X mts

 
Avatar Hugo A. G. V. Rosa 1 post

Peço desculpas por responder milênios depois, mas acabei de chegar e tenho algumas sugestões.

Já que o reduce e inject não fornecem o que desejas, que tal esse metodo, você pode adicionar na classe Array ou onde quiser.

A chamada para ele seria

Com algumas modificações podes já fornecer o objeto ao invés do índice, ou usar a idéia (yield) para o método que fornece a distancia que o Fernando passou. Por exemplo:

e a chamada ficaria:

 
Avatar nofxx 1960 posts

Po Hugo, interessante isso kra. Vou experimentar.

Valeu!