Если объект реализует итератор или содержит другой объект, который реализует итератор

Использование aggregate с номером unique (length(unique))

filterdf=aggregate(Value ~ Class, df, function(x) length(unique(x)))
df[df$Class%in%filterdf[filterdf$Value==1,]$Class,]
   Class Value
1      A  5.40
2      A  5.40
3      A  5.40
6      C  4.02
7      C  4.02
8      C  4.02
9      D  6.33
10     D  6.33

Альтернатива от Маркуса

idx <- with(df, ave(Value, Class, FUN = function(x) length(unique(x))) == 1)
df[idx, ]
5
задан bbxbby 19 October 2008 в 06:08
поделиться

6 ответов

bbxbby, лучшим решением обычно является самое простое. Вы определенно не сверхусложняете вещи, создающие отдельный объект итератора. На самом деле PHP поддерживает и поощряет такое обеспечение агрегирования IteratorAggregate интерфейс. Реализация объектов IteratorAggregate должен содержать getIterator() возврат метода Iterator. Это действительно что Ваш getChocolated() метод делает. Хорошая вещь о IteratorAggregate это, можно передать объект его непосредственно к foreach цикл. Ваш код мог бы быть похожим как этот при использовании его:

class BoxOfChocolates implements IteratorAggregate

    private $chocolates = array();

    public function getIterator() {
        return new ArrayIterator(new ArrayObject($this->chocolates)));
    }

}

И затем, где-нибудь в коде:

$box = new BoxOfChocolates();
foreach ($box as $chocolate) { ... }
4
ответ дан 14 December 2019 в 09:04
поделиться

Ну, я не знаю PHP, таким образом, я не могу правильно ответить на вопрос, но я попытаюсь связать его с областью, которую я действительно знаю.

В C# существует два интерфейса: IEnumerable и IEnumerator. В Вашем примере BoxOfChocolates был бы Счетным, Конфетами будет Перечислитель.

Enumerables просто имеют метод, который возвращает Перечислитель. Перечислители имеют понятие текущего объекта и средство перемещения в следующий объект. В большинстве случаев класс Перечислителя не "замечен". Например, в строке "foreach (Шоколадный объект в boxOfChoclates)" boxOfChocolates Счетное; объект Перечислителя полностью скрыт foreach.

0
ответ дан 14 December 2019 в 09:04
поделиться

Вполне просто контейнер является местом для реализации итератора.

0
ответ дан 14 December 2019 в 09:04
поделиться

Я думаю, что необходимо разделить наборы от итераторов. Я согласился бы с @James Curran, что наборы часто имеют итераторы - на самом деле, у них могли быть несколько. Например, можно хотеть итератор, который пропускает леденец с гайками (хотя типичный случай должен хотеть тот, который инвертирует упорядочивание). В этом случае значение следующего () изменения метода. Для обработки этого реализуйте итераторы в отдельных классах, которые содержат их собственную итеративную семантику. Предоставьте методы в наборе для получения итераторов надлежащего вида. Это - действительно проблема разделения проблем. Набор не заботится, как пользователь выполняет итерации по нему, который является беспокойством итератора.

0
ответ дан 14 December 2019 в 09:04
поделиться

Это зависит от ситуации. Поле конфет идет, t0 содержат несколько наборов? Раз так у Вас должны быть наборы быть участниками.

Думайте о нем этот путь. Поле конфет набор (т.е. PersonList) или что-то, что владеет набором (т.е. автомобиль может владеть набором, он - последние владельцы).

Я думаю, что это подпадает под первую группу

:)

2
ответ дан 14 December 2019 в 09:04
поделиться

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

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

1
ответ дан 14 December 2019 в 09:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: