循环遍历数组,并检查每个项目

时间:2013-04-28 18:14:11

标签: ruby

我有一个数组:@costumer_request = ['regular', '12/03/2013', '14/03/2013']。 我需要验证第一项是“常规”还是“奖励”,然后验证阵列其余部分的每个日期是否为周末。 我做了这样的事情:

@costumer_request.each_with_index do |item, index|
  if index[0] == 'regular:'
    if DateTime.parse(index).to_date.saturday? or  DateTime.parse(index).to_date.sunday?
      print "It's a weekend"
    else
      print "It's not a weekend"
    end
  end
end

require 'date'

module HotelReservation

  class Hotel

    HOTELS = {
      :RIDGEWOOD   => 'RidgeWood',
      :LAKEWOOD    => 'LakeWood',
      :BRIDGEWOOD  => 'BridgeWood'
    }

    def weekend?(date)
      datetime = DateTime.parse(date)
      datetime.saturday? || datetime.sunday?
    end

    def find_the_cheapest_hotel(text_file)

      @weekends_for_regular = 0
      @weekdays_for_regular = 0

      @weekends_for_rewards = 0
      @weekdays_for_rewards = 0

      File.open(text_file).each_line do |line|

       @costumer_request = line.delete!(':').split
       @costumer_request = line.delete!(',').split

       #Here I want to process something in each array
       #but if I do something like bellow, it will
       #store the result of the two arrays in the same variable
       #I want to store the result of the first array, process something
       #and then do another thing with the second one, and so on.

       if(@costumer_request.first == 'regular')
         @costumer_request[1..-1].each do |date|
           if (weekend?(date))
            @weekends_for_regular +=1
           else
            @weekdays_for_regular +=1
           end
        end
        else
          if(@costumer_request.first == 'rewards')
            @costumer_request[1..-1].each do |date|
            if (weekend?(date))
              @weekends_for_rewards +=1
            else
              @weekdays_for_rewards +=1
            end
          end
        end
      end
    end
  end
end
end

find_the_cheapest_hotel方法应根据给定数据输出最便宜的酒店。

5 个答案:

答案 0 :(得分:1)

require 'time'
require 'date'
@costumer_request = ['regular', '28/03/2013', '14/03/2013']
if @costumer_request.first == 'regular'
    if @costumer_request[1...-1].all?{|item| Time.local(item).saturday? || Time.local(item).sunday? }
        print "It's a weekend"
    else
        print "It's not a weekend"
    end
end

输出:

It's a weekend

答案 1 :(得分:0)

require 'time'

def weekend?(date)
  datetime = DateTime.parse(date)
  datetime.saturday? || datetime.sunday?
end

@costumer_request = ['regular', '28/03/2013', '14/03/2013']

type = @costumer_request.shift

if type == 'regular'
  @costumer_request.each do |date|
     if weekend?(date)
       puts "#{date} a weekend"
     else
       puts "#{date} not a weekend"
     end
   end
end

答案 2 :(得分:0)

您也可以直接将weekend?添加到DateTime:

class DateTime
  def weekend?
    saturday? || sunday?
  end
end

现在你可以将除第一个元素之外的所有元素转换为DateTime对象,然后检查它们是否都在周末。

if @customer_request.first == 'regular'
  dates = @customer_request[1..-1].map { |date_string| DateTime.parse(date_string) }
  if dates.all?(&:weekend?)
    puts 'all dates on a weekend'
  else
    puts 'at least one date is not on a weekend'
  end
else
  puts 'not a regular customer request'
end

答案 3 :(得分:0)

这是一种非常干净的方式:

def is_weekend?(dt)
  dt.saturday? || dt.sunday?
end

type, *dates = @costumer_request

if(type == 'regular')
  dates.each do |date|
    if(weekend?(Date.parse(date))
      #do processing here
    end
  end
end

答案 4 :(得分:-1)

@customer_request = ['regular', '12/03/2013', '14/03/2013']



def val
  @customer_request.first == 'regular' &&
    @customer_request.drop(1).inject(true)  do |m, e|
      wd = Time.local(*e.split('/').reverse.map(&:to_i))
      m &&= (wd.saturday? || wd.sunday?)
    end
end


p val
p val ? 'all are weekends' : 'something isn\'t a weekend'