Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.04;
Скачать: CL | DM;

Вниз

Сравнение   Найти похожие ветки 

 
Володя   (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;

Вариант 2
var
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;


&#133


 
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]

> Это не сравнение.

Сравнить можно по разным критериям. Автор хочет сравнить по критерию &laquo;совпадение полей&raquo;. Что я ему и предложил.

Для чего это надо?

Пример.
Допустим имеем список объектов. Объекты в списке имеют поле(свойство) &laquo;Имя&raquo;.

Задача сделать так, чтобы в списке небыло объектов с одинаковыми именами.
Для решения я в цикле переберу все имеющиеся объекты и если найду с таким же именем, то тот что мне дали для добавления выброшу&#133


 
Володя   (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]

> Вопрос: они суть одно и то же?
> Ответ &#151; нет. Это ДВА РАЗНЫХ экземпляра. Но с одинаковыми
> свойствами.


Допустим ты и твой друг коллекционируете наклейки от жевачек турбо. И ты съев жвачку нашел там новую наклйку.
Ты приходиш к другу и гриш: &laquo;Давай меняться&raquo;, а он отвечает: &laquo;Нет, у меня такая уже есть!&#133&raquo;

Вопрос для друга твоего его и твоя наклейка &laquo;суть одно и то же&raquo;?
Ответ &#151; да.


 
Володя   (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.

Если полей много, то вручную сравнивать их противно, с другой стороны хранить свойства в массиве тоже неудобно&#133
Тут есть много решений, для ответа нужно видеть конкретный класс&#133


 
Игорь Шевченко ©   (2007-09-28 16:40) [24]


> Есть два обьекта с набором определенных свойств (например,
>  20).


Аккуратным сравнением каждого свойства с одноименным свойством другого объекта. И код будет понятный и результат очевидный.


 
Володя   (2007-09-28 16:44) [25]

Ну все, примерное понял, буду реализовывать. Спасибо, товарищи!


 
Kolan ©   (2007-09-28 16:44) [26]

> Аккуратным сравнением каждого свойства с одноименным свойством
> другого объекта. И код будет понятный и результат очевидный.

+1(особенно про понятность)&#133


 
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]

> Считать хеш функцию по интересующим полям.

Можно пролететь, и к томуже хеш считать всеравно в ручную будешь поля выписывать, проше сразу сравнить&#133


 
Kolan ©   (2007-09-28 16:52) [32]

> Что дальше?

Что&#133Счтитаешь для &laquo;стучащегося&raquo; хеш и сравниваешь&#133


 
Володя   (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&#133

ЗЫ
А ветки надо читать с начала&#133


 
Ega23 ©   (2007-09-28 17:19) [40]


> Клоню к тому, что если оба объекта являются объектами единого
> класса-наследника TComponent, и св-ва, подлежащие сравнению,
>  являются опубликованными, то сравнение сводится к элементарной
> записи обоих объектов в потоки и тривиальное бинарное сравнение
> (ComareMem) содержимого этих потоков.


Нечто подобное я ещё в [1] предлагал.
Хотя для Tcomponent c его WriteComponent - действительно интересное решение.
Возьму на заметку.



Страницы: 1 2 вся ветка

Текущий архив: 2007.11.04;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.013 c
15-1191308496
tesseract
2007-10-02 11:01
2007.11.04
Кто там про юзабилити спрашивал ?


2-1192094348
Tonich
2007-10-11 13:19
2007.11.04
быстрый поиск в структуре (record)


15-1190864226
azamatufa
2007-09-27 07:37
2007.11.04
Про работу форума


2-1191573113
SCL
2007-10-05 12:31
2007.11.04
Поиск файлов


6-1172922118
buben
2007-03-03 14:41
2007.11.04
post послать файл на сервер