Tengo la siguiente matriz de 2 dimensiones
data = [ [5014031, nil], [5014032, nil], [5014033, 0], [5014034, nil], [3014035, 1], [5014036, 1], [5014037, 2], [5014038, nil], [5014039, 2], [5014040, nil], [2014041, nil], [3014042, 2] ]Cuando sé el valor del primer entero de una de estas matrices, por ejemplo, 5014034, ¿cuál sería la forma más eficiente de obtener el siguiente valor entero donde el segundo elemento coincide con cero? (por ejemplo, espero que se devuelva 5014038)
gracias scott
Manera simple, usando #drop_while y #find_index :
data = [ [5014031, nil], [5014032, nil], [5014033, 0], [5014034, nil], [5014035, 1], [5014036, 1], [5014037, 2], [5014038, nil], [5014039, 2], [5014040, nil], [5014041, nil], [5014042, 2] ] remaining_arr = data.drop_while { |arr| arr[0] != 5014034 }[1 .. -1] next_int = remaining_arr[remaining_arr.find_index { |arr| arr[1].nil? }][0]Puede dividir la matriz en dos cuando el primer elemento de la matriz interna coincida con 5014034 . Extrae la segunda matriz resultante y usa find para buscar la matriz interna cuyo segundo elemento es nulo:
arr .slice_when { |a, _| a == 5014034 } # #<Enumerator: ...> .to_a # [[[5014031, nil], [5014032, nil], [5014033, 0], [5014034, nil]], [[5014035, 1], [5014036, 1], [5014037, 2], [5014038, nil], [5014039, 2], [5014040, nil], [5014041, nil], [5014042, 2]]] [1] # [[5014035, 1], [5014036, 1], [5014037, 2], [5014038, nil], [5014039, 2], [5014040, nil], [5014041, nil], [5014042, 2]] .find { |_, b| b.nil? } # [5014038, nil] [0] # 5014038 Tenga en cuenta que el encadenamiento de este método puede fallar si no hay una matriz en arr cuyo primer objeto dentro coincida con 5014034 y/o lo mismo para find .
Si se ordena, lo siguiente podría ser más rápido
data = [ [5014031, nil], [5014032, nil], [5014033, 0], [5014034, nil], [5014035, 1], [5014036, 1], [5014037, 2], [5014038, nil], [5014039, 2], [5014040, nil], [5014041, nil], [5014042, 2] ] start_element = data.bsearch_index{ |a| a[0] >= 5014034 } if start_element == nil || data[start_element] != 5014034 puts "not found" else data.slice((start_element+1)..).find { |a| a[1] == nil }[0] end