Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby: Общие вопросы > Получение первого элемента массива по критерию


Автор: rubyfan 5.10.2009, 15:32
Всем привет,

задача такая - пропустить массив элементов через метод, вернуть первый элемент, который удовлетворяет критерию, удаляя при этом все встретившиеся невалидные элементы.

Написал пример на php для наглядности:

Код

<?php

$a = array(0,0,0,1,2,3,0,0,0);

function return_first_valid(&$a) {

    foreach ($a as $key => $element) {
    
        if($element > 0) {
            return $element;
        }
    
        unset($a[$key]);
    
    }

}

var_dump(return_first_valid($a)); # 1

var_dump($a); # 1,2,3,0,0,0

?>


Вот код на руби, который я пытался написать, видимо что-то упустил, так как конечный массив содержит непонятную последовательность элементов:
Код

a = (0..10).to_a

def b array
  array.each { |element| 
    return element if element == 10
    array.delete(element)
  }
end

p b(a) # 10

p a # [1, 3, 5, 7, 9, 10]


Автор: fixxer 5.10.2009, 22:16
Код

a = (0..10).to_a
res = a.find {|e| e == 5}
a.slice! a.index(res), a.length

Автор: doomik 5.10.2009, 22:19
Можно:
Код

def do_it(arr)

if arr.empty? then # проверка если лист пуст
    return 0
end

while arr[0] != nil do
    if arr[0] == 10 then
       return arr[0]
    else 
       arr.delete(arr[0])
    end
end



При удалении элемента из списка ( arr.delete() ) все следующие элементы сдвигаются в лево, поэтому вместо [1, 2, nil, 3, 4...] у нас получается [1, 2, 3, 4].

список:   1  2  3  4  5
               ^
индекс:  [0]


после выполнение arr.delete(1)
список:  2     3     4     5
              ^
индекс: [0]  [1]  [2]  [3] 


После этого each передаёт следующий элемент в блок, что значит по индексу 1 т.к предыдущий был 0.
список:  2   3   4   5
                   ^
индекc:      [1]

Здесь  у нас перескок.
Поэтому некоторые элементы не удаляются.

Вроде как то так.  smile 

Автор: rubyfan 6.10.2009, 01:11
doomik, в цикле/итерации в руби нельзя удалять элементы smile вот поэтому такой разброс, а код fixxer'а завтра протестирую, он кажется рабочим smile Спасибо smile 

Автор: Goganchic 13.10.2009, 13:48
Цитата(rubyfan @  6.10.2009,  01:11 Найти цитируемый пост)
в цикле/итерации в руби нельзя удалять элементы

Извини, а почему говоришь нельзя в руби удалять элементы в цикле?

Автор: source777 13.10.2009, 22:34
Наверно потому, что он не понял то, что ему doomik старался объяснить. smile 

Автор: Goganchic 14.10.2009, 19:07
source777, а, ну ладно тогда, просто я уже год как удаляю, а тут бабац и нельзя, вот я и решил узнать что я делаю не так  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)