Форум: "Прочее";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];
ВнизСравнение Найти похожие ветки
← →
Володя (2007-09-28 15:39) [0]Привет. Подскажите:
Есть два обьекта с набором определенных свойств (например, 20). Необходимо сравнить два обьекта. Причем резльтат сравнения - просто ответ - совпали или нет. Если хотя бы одно свойство не совпадает, все, обьекты разные. Это необходимо для сравнения одного и того же обьекта после определенных действий с ним.
Подскажите, как наиболее быстро сравнить эти обьекты. Перебирать каждое свойство?
← →
Ega23 © (2007-09-28 15:46) [1]Ну, во первых, достаточно сравнить указатели на эти экземпляры класса.
Если сами указатели разные, то объекты - РАЗНЫЕ.
Если же тебе нужно сравнить два РАЗНЫХ объекта на предмет совпадения у них каких-то свойств, то да, без перебора не обойтись.
Другое дело, если эти свойства published, то можно данный процесс автоматизировать.
← →
Альберт_ (2007-09-28 15:47) [2]свойства в массиве. и по элементам гонишься
← →
Володя (2007-09-28 15:57) [3]
> Ega23 © (28.09.07 15:46) [1]
То есть, например, А.х=5; А.y=10 и B.x=10; B.y=15, то можно сказать что A!=B ?
← →
evvcom © (2007-09-28 16:02) [4]
> и по элементам гонишься
Велик и могуч русский язык! Настолько могуч, что даже русским русских уже не понять.
← →
evvcom © (2007-09-28 16:02) [5]
> Володя (28.09.07 15:57) [3]
А что такое А и B?
← →
Альберт_ (2007-09-28 16:05) [6]obj1[x]=obj2[x]
где x - const, называй ее как кайф. и в цикле проверяй
← →
Ega23 © (2007-09-28 16:09) [7]
> То есть, например, А.х=5; А.y=10 и B.x=10; B.y=15, то можно
> сказать что A!=B ?
А что такое B и А?type
TMyObject = class
public
X : Integer;
Y : Integer;
end;
Вариант 1.var
A, B : TMyObject;
А := TMyObject.Create;
A.X := 10;
A.Y := 20;
B := A;
Вариант 2var
A, B : TMyObject;
А := TMyObject.Create;
A.X := 10;
A.Y := 20;
B := TMyObject.Create;
B.X := 10;
B.Y := 20;
Вот в первом случае A=B, это строго
Во втором случае, всего лишь (A.X=B.X) и (A.Y=B.Y). Но A<>B.
Чуешь разницу?
← →
Володя (2007-09-28 16:09) [8]
> evvcom © (28.09.07 16:02) [5]
>
> > Володя (28.09.07 15:57) [3]
>
> А что такое А и B?
> <Цитата>
А И В - экземпляры класса.
> obj1[x]=obj2[x]
> где x - const, называй ее как кайф. и в цикле проверяй
честно, не понял...какой кайф?
← →
Володя (2007-09-28 16:12) [9]
> >
> > А что такое А и B?
> > <Цитата>
>
> А И В - экземпляры класса.
Class MyClass
{
int x;
int y;
}
MyClass A=new MyClass();
MyClass B=new MyClass();
A.x=10; A.y=15;
B.x=10; A.y=20;
A==B?
← →
Володя (2007-09-28 16:13) [10]Вернее
А!=В ?
← →
Anatoly Podgoretsky © (2007-09-28 16:15) [11]> Володя (28.09.2007 16:09:08) [8]
А и В считают равными, если совпадают их адреса.
← →
Kolan © (2007-09-28 16:19) [12]Я чего-то не понимаю?
Пишешь метод:TMyObject = class
public
X : Integer;
Y : Integer;
function Compare(AObject: TMyObject): Boolean;
end;function TMyObject.Compare(AObject: TMyObject): Boolean;
begin
Result := False;
if Assigned(AObject) then
begin
Result := X = AObject.X;
Result := Result and (Y = AObject.Y);
end;
end;
…
← →
Kolan © (2007-09-28 16:20) [13]Сравнение можно сделать(и правильнее будет) с помощью if, чтобы не проверять дальше если уже False
← →
Ega23 © (2007-09-28 16:20) [14]
> Володя (28.09.07 16:13) [10]
>
> Вернее
> А!=В ?
>
Да.
← →
Ega23 © (2007-09-28 16:23) [15]
> Kolan © (28.09.07 16:19) [12]
Это не сравнение.
Блин, вот есть тираж "Московского Комсомольца" за 1 ноября сего года. 1000000 экземпляров.
Возьмём 14-й и 1563-й экземпляры.
В каждом экземпляре равное количество символов, а также равное количество страниц.
Вопрос: они суть одно и то же?
Ответ - нет. Это ДВА РАЗНЫХ экземпляра. Но с одинаковыми свойствами.
← →
Kolan © (2007-09-28 16:29) [16]> Это не сравнение.
Сравнить можно по разным критериям. Автор хочет сравнить по критерию «совпадение полей». Что я ему и предложил.
Для чего это надо?
Пример.
Допустим имеем список объектов. Объекты в списке имеют поле(свойство) «Имя».
Задача сделать так, чтобы в списке небыло объектов с одинаковыми именами.
Для решения я в цикле переберу все имеющиеся объекты и если найду с таким же именем, то тот что мне дали для добавления выброшу…
← →
Володя (2007-09-28 16:29) [17]То есть, если обобщить, нужно поместить свойства в массив и проверять в цикле до первого false.
← →
KSergey © (2007-09-28 16:31) [18]Если класс именно такой - можно память под ним сравнить - да и все.
Правда, лучше тогда packed сделать, чтобы не проколоться на незанятых при выравнивании местах.
А вот если в полях будут указатели лежать на что-то, к примеру - то только явно прописанное в коде почленное сравнение. Ну либо published свойства, как и говорилось. Если все же о дельфи речь вести.
> Альберт_ (28.09.07 16:05) [6]
> obj1[x]=obj2[x]
Так в структуре вовсе не обязателдьно все поля одного типа, а в массиве - обязательно.
← →
Kolan © (2007-09-28 16:32) [19]> Вопрос: они суть одно и то же?
> Ответ — нет. Это ДВА РАЗНЫХ экземпляра. Но с одинаковыми
> свойствами.
Допустим ты и твой друг коллекционируете наклейки от жевачек турбо. И ты съев жвачку нашел там новую наклйку.
Ты приходиш к другу и гриш: «Давай меняться», а он отвечает: «Нет, у меня такая уже есть!…»
Вопрос для друга твоего его и твоя наклейка «суть одно и то же»?
Ответ — да.
← →
Володя (2007-09-28 16:32) [20]
> Задача сделать так, чтобы в списке небыло объектов с одинаковыми
> именами.
> Для решения я в цикле переберу все имеющиеся объекты и если
> найду с таким же именем, то тот что мне дали для добавления
> выброшу…
Точно, если имя того что мне дали для добавления совпадает с именем присутствующего, и все поля их совпадают, то ничего не происходит; если хоть одно поле различается, старый объект заментятся новым.
← →
Володя (2007-09-28 16:34) [21]
> старый объект заментятся новым.
Можно сказать также, что отличающееся поле у старого обьекта принимает знаечение нового обьекта, так как остальные равны.
← →
Альберт_ (2007-09-28 16:38) [22]да через массивы и иип string в данном случае можно и эмулировать другие типы данных.
← →
Kolan © (2007-09-28 16:38) [23]> Можно сказать также, что отличающееся поле у старого обьекта
> принимает знаечение нового обьекта, так как остальные равны.
Для замены значений полей(свойств) напиши функциюAssign
, по аналогии сCompare
.
Если полей много, то вручную сравнивать их противно, с другой стороны хранить свойства в массиве тоже неудобно…
Тут есть много решений, для ответа нужно видеть конкретный класс…
← →
Игорь Шевченко © (2007-09-28 16:40) [24]
> Есть два обьекта с набором определенных свойств (например,
> 20).
Аккуратным сравнением каждого свойства с одноименным свойством другого объекта. И код будет понятный и результат очевидный.
← →
Володя (2007-09-28 16:44) [25]Ну все, примерное понял, буду реализовывать. Спасибо, товарищи!
← →
Kolan © (2007-09-28 16:44) [26]> Аккуратным сравнением каждого свойства с одноименным свойством
> другого объекта. И код будет понятный и результат очевидный.
+1(особенно про понятность)…
← →
Algol (2007-09-28 16:46) [27]
> Подскажите, как наиболее быстро сравнить эти обьекты. Перебирать
> каждое свойство?
Считать хеш функцию по интересующим полям.
← →
KSergey © (2007-09-28 16:46) [28]> Игорь Шевченко © (28.09.07 16:40) [24]
> Аккуратным сравнением каждого свойства с одноименным свойством
> другого объекта. И код будет понятный и результат очевидный.
одно меня заботит в таком варианте: как бы так бы автоматизировать проверку на то, что новое поле добавил - а в сравнивающий код сравнение по новому полю добавить забыл? Чего-то бы написать, чтобы или при компиляции или в runtime поломалось... Или только на внимательность разработчика надежда?
← →
Игорь Шевченко © (2007-09-28 16:47) [29]KSergey © (28.09.07 16:46) [28]
Unit-тесты написать ? :) Самое оно
← →
Володя (2007-09-28 16:51) [30]
> Считать хеш функцию по интересующим полям.
Смортри, есть совокупность однотипных обектов с полям со свойствами. Посчитаю я хэш-функцию. Стучится туда новый обьект с таким же именем, но сразными значениями таких же полей. Что дальше?
← →
Kolan © (2007-09-28 16:51) [31]> Считать хеш функцию по интересующим полям.
Можно пролететь, и к томуже хеш считать всеравно в ручную будешь поля выписывать, проше сразу сравнить…
← →
Kolan © (2007-09-28 16:52) [32]> Что дальше?
Что…Счтитаешь для «стучащегося» хеш и сравниваешь…
← →
Володя (2007-09-28 16:57) [33]В грубом приближении мне нужно чтото типа если кинуть файл в папку, где есть файл с таким же именемЮ то если все другие атрибуты совпадают (дата создания, измения, размер) то ничего не происходит, есди же чтото отличатеся, то это уже другой файл, отличающийся от лежащего в папке и тот заменяется новым... Вот, очень точное сравнение.
← →
Kolan © (2007-09-28 16:59) [34]> В грубом приближении
Мы кажется все поняли что тебе нужно. И даже как это сделать:
Теория:
[24] Игорь Шевченко © (28.09.07 16:40)
Вариант реализации:
[12] Kolan © (28.09.07 16:19)
В чем вопрос?
← →
Володя (2007-09-28 17:00) [35]Да не, все понял..спасибо..
← →
Сергей М. © (2007-09-28 17:02) [36]
> Володя
Объекты одного и того же класса ? Какого ?
← →
Desdechado © (2007-09-28 17:10) [37]Я бы в класс вставил метод сравнения с однотипным. Там можно учесть даже такие внутренности, которые внешним функциям недоступны. А также можно сделать глубокое сравнение, учитывающее объектные свойтсва экземпляров.
← →
Сергей М. © (2007-09-28 17:15) [38]Клоню к тому, что если оба объекта являются объектами единого класса-наследника TComponent, и св-ва, подлежащие сравнению, являются опубликованными, то сравнение сводится к элементарной записи обоих объектов в потоки и тривиальное бинарное сравнение (ComareMem) содержимого этих потоков.
← →
Kolan © (2007-09-28 17:18) [39]> Я бы в класс вставил метод сравнения с однотипным.
И это решение соответствует паттерну InformationExpert…
ЗЫ
А ветки надо читать с начала…
← →
Ega23 © (2007-09-28 17:19) [40]
> Клоню к тому, что если оба объекта являются объектами единого
> класса-наследника TComponent, и св-ва, подлежащие сравнению,
> являются опубликованными, то сравнение сводится к элементарной
> записи обоих объектов в потоки и тривиальное бинарное сравнение
> (ComareMem) содержимого этих потоков.
Нечто подобное я ещё в [1] предлагал.
Хотя для Tcomponent c его WriteComponent - действительно интересное решение.
Возьму на заметку.
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.061 c