Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение первого элемента массива по критерию 
:(
    Опции темы
rubyfan
  Дата 5.10.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 5.10.2009

Репутация: нет
Всего: нет



Всем привет,

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

Написал пример на 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]


PM MAIL   Вверх
fixxer
Дата 5.10.2009, 22:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: нет
Всего: 27



Код

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


Это сообщение отредактировал(а) fixxer - 5.10.2009, 22:17


--------------------
user posted image
PM MAIL ICQ   Вверх
doomik
Дата 5.10.2009, 22:19 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Одинокий волк
**


Профиль
Группа: Участник
Сообщений: 360
Регистрация: 25.10.2005
Где: #vingrad

Репутация: нет
Всего: 15



Можно:
Код

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 


Это сообщение отредактировал(а) doomik - 5.10.2009, 22:22


--------------------
"Единственный способ изучать новый язык программирования - писать на нем 
программы." 
- Brian Kernighan

Remember, st1ng3r 
/server irc.ircline.ru /j #vingrad
PM   Вверх
rubyfan
Дата 6.10.2009, 01:11 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 5.10.2009

Репутация: нет
Всего: нет



doomik, в цикле/итерации в руби нельзя удалять элементы smile вот поэтому такой разброс, а код fixxer'а завтра протестирую, он кажется рабочим smile Спасибо smile 
PM MAIL   Вверх
Goganchic
Дата 13.10.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 678
Регистрация: 18.6.2004

Репутация: нет
Всего: 5



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

Извини, а почему говоришь нельзя в руби удалять элементы в цикле?
PM Jabber   Вверх
source777
Дата 13.10.2009, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 6
Всего: 56



Наверно потому, что он не понял то, что ему doomik старался объяснить. smile 


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Goganchic
Дата 14.10.2009, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 678
Регистрация: 18.6.2004

Репутация: нет
Всего: 5



source777, а, ну ладно тогда, просто я уже год как удаляю, а тут бабац и нельзя, вот я и решил узнать что я делаю не так  smile 
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Ruby: Общие вопросы"
source777
  • С чего начать? начинаем
  • Ссылки на полезные ресурсы смотрим тут
  • Обязательно следуйте правилам Vingrad.
  • Пожалуйста, прочитайте рекомендации по работе в форуме и навигации по Vingrad.
  • Для вставки кодов Ruby используйте тег: [code=ruby]код[/code]. Когда в будущем подсветка синтаксиса для Ruby будет реализована, весь исходных код преобразится.
  • Используйтe чекбокс "Транслит" (возле кнопок кодов), если у Вас нет русских шрифтов.
  • Помните, для каждого вопроса должна быть своя тема.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, source777.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Ruby: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0458 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.