Показанная подпрограмма хороша для работы с массивом, который для элементов имеет ссылки на массив. Это действительно основной способ организации 2D-данных, где ваши строки - это arrayrefs.
Существуют модули, которые могут быть использованы для этого, но этот старый добрый метод также хорошо работает
use warnings;
use strict;
use Data::Dump qw(dd);
sub uniq_arys {
my %seen;
grep { not $seen{join $;, @ Показанная подпрограмма хороша для работы с массивом, который для элементов имеет ссылки на массив. Это действительно основной способ организации 2D-данных, где ваши строки - это arrayrefs.
Существуют модули, которые могут быть использованы для этого, но этот старый добрый метод также хорошо работает
[110] Печатает как ожидалось (последняя строка пропала), используя Data :: Dump [ 114], чтобы показать данные.
Подпрограмма работает путем объединения каждого массива в строку, а затем они проверяются на наличие дубликатов с использованием хэша. $; является разделителем нижнего индекса , и вместо этого пустая строка ''
вполне подойдет.
Этот подход создает много вспомогательных данных - в принципе, удваивает данные - и, если производительность становится проблемой, может быть лучше просто сравнить поэлементно (ценой сложности). Это может быть проблемой только с довольно большими наборами данных.
Пример модуля: используйте uniq_by
из List :: UtilsBy
use List::UtilsBy qw(uniq_by);
my @no_dupes = uniq_by { join '', @ Показанная подпрограмма хороша для работы с массивом, который для элементов имеет ссылки на массив. Это действительно основной способ организации 2D-данных, где ваши строки - это arrayrefs.
Существуют модули, которые могут быть использованы для этого, но этот старый добрый метод также хорошо работает
[110] Печатает как ожидалось (последняя строка пропала), используя Data :: Dump [ 114], чтобы показать данные.
Подпрограмма работает путем объединения каждого массива в строку, а затем они проверяются на наличие дубликатов с использованием хэша. $; является разделителем нижнего индекса , и вместо этого пустая строка ''
вполне подойдет.
Этот подход создает много вспомогательных данных - в принципе, удваивает данные - и, если производительность становится проблемой, может быть лучше просто сравнить поэлементно (ценой сложности). Это может быть проблемой только с довольно большими наборами данных.
Пример модуля: используйте uniq_by
из List :: UtilsBy
[111] Это более или менее совпадает с подпунктом выше. [1114 ] } @data;
Это более или менее совпадает с подпунктом выше. [1114 ]}++ } @_;
}
my @data = (
[ qw(one two three) ],
[ qw(ten eleven twelve) ],
[ qw(10 11 12) ],
[ qw(ten eleven twelve) ],
);
my @data_uniq = uniq_arys(@data);
dd \@data_uniq;
Печатает как ожидалось (последняя строка пропала), используя Data :: Dump [ 114], чтобы показать данные.
Подпрограмма работает путем объединения каждого массива в строку, а затем они проверяются на наличие дубликатов с использованием хэша. $; является разделителем нижнего индекса , и вместо этого пустая строка ''
вполне подойдет.
Этот подход создает много вспомогательных данных - в принципе, удваивает данные - и, если производительность становится проблемой, может быть лучше просто сравнить поэлементно (ценой сложности). Это может быть проблемой только с довольно большими наборами данных.
Пример модуля: используйте uniq_by
из List :: UtilsBy
use List::UtilsBy qw(uniq_by);
my @no_dupes = uniq_by { join '', @ Показанная подпрограмма хороша для работы с массивом, который для элементов имеет ссылки на массив. Это действительно основной способ организации 2D-данных, где ваши строки - это arrayrefs.
Существуют модули, которые могут быть использованы для этого, но этот старый добрый метод также хорошо работает
[110] Печатает как ожидалось (последняя строка пропала), используя Data :: Dump [ 114], чтобы показать данные.
Подпрограмма работает путем объединения каждого массива в строку, а затем они проверяются на наличие дубликатов с использованием хэша. $; является разделителем нижнего индекса , и вместо этого пустая строка ''
вполне подойдет.
Этот подход создает много вспомогательных данных - в принципе, удваивает данные - и, если производительность становится проблемой, может быть лучше просто сравнить поэлементно (ценой сложности). Это может быть проблемой только с довольно большими наборами данных.
Пример модуля: используйте uniq_by
из List :: UtilsBy
[111] Это более или менее совпадает с подпунктом выше. [1114 ] } @data;
Это более или менее совпадает с подпунктом выше. [1114 ]
Значение использования интерфейса всегда является тем же: Вы не должны изменять клиентский код при переключении на другую реализацию бэкенда.
Полагайте, что профилирование кода более поздние шоу, что реализация хеш-таблицы (использовал в Dictionary
класс), не подходит для Вашей задачи и что дерево двоичного поиска работало бы лучше. Если Вы кодировали к интерфейсу, затем переключающему реализацию, просто. Однако, при использовании реального класса необходимо изменить намного больше кода в намного большем количестве мест. => Это стоит времени и денег.
IDictionary включает более свободную связь.
Скажите, что у Вас есть метод как это:
void DoSomething(IDictionary<string, string> d)
{
//...
}
Можно использовать его как это:
Dictionary<string, string> a = new Dictionary<string, string>();
SortedDictionary<string, string> b = new SortedDictionary<string, string>();
DoSomething(a);
DoSomething(b);
На основе Вашего предыдущего вопроса Класс наследовался универсальный dictionary<string, IFoo>
и Интерфейс и обсуждение в ответах, я предполагаю Ваше выяснение больше о наследовании от вместо использования.
Реализация из Словаря прекрасна, если Ваше довольное путем словарь реализовано. Если Вы хотите изменить что-то, то реализация IDictionary лучше.
По моему скромному мнению, если Вы собираетесь покрыть существующего участника 'новым' затем, лучше реализовать интерфейс, а не наследоваться исходному классу.