2012-03-03 2 views
1

У меня есть массив классов, и я хочу найти, где может быть перекрытие графика.найти совпадающие времена в массиве хэшей

Мой массив что-то вроде этого

[ 
    { 
    id:2, 
    start: "3:30", 
    length: 40, 
    break: 30, 
    num_attendees: 14 
    }, 
    { 
    id: 3, 
    start: "3: 40", 
    length: 60, 
    break: 40, 
    num_attendees: 4 
    }, 
    { 
    id: 4, 
    start: "4: 40", 
    length: 30, 
    break: 10, 
    num_attendees: 40 
    } 
] 

довольно просто. Теперь я хочу получить массив, в котором я добавляю начало и длину, а затем получаю классы, которые перекрываются, чтобы уведомить пользователя о конфликте.

Я знаю, что могу сделать большой цикл и сравнить этот путь, но я думаю, что в Ruby должен быть более хороший способ сделать это, например (не обращайте внимания, что мы не работаем в абсолютные минуты здесь, У меня это есть, я просто хочу, чтобы этот пример был простым).

 
overlap = class_list.select{|a,b| if a.start+a.length>b.start return a,b end} 

любые предложения?

ответ

2

Вы можете использовать Array#combination так:

class_list.combination(2).select{|c1, c2| 
    # here check if c1 and c2 overlap 
} 
+0

Таким образом, вы получите все, что в два раза, и вы будете сравнивать элементы с самим собой. – Reactormonk

+0

Не с 'комбинацией'. С 'продуктом' или' перестановкой', да. –

+0

спасибо mladen, это своего рода работа, это лучший способ поместить результаты в массив, чтобы сделать 'find_overlap << [c1, c2]' ?? – pedalpete

Смежные вопросы