Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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;

Вариант 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 - действительно интересное решение.
Возьму на заметку.


 
Сергей М. ©   (2007-09-28 17:22) [41]


> Ega23 ©   (28.09.07 17:19) [40]


> Tcomponent c его WriteComponent


Точнее Read/WriteComponent - это меоды стримов, а не компонентов.
Но суть одна и та же.


 
Sandman31   (2007-09-28 17:37) [42]

Записывать в потоки, чтобы сравнить 2 объекта???
Посмотрите на то, как сравнение организовано в java. Метод equals(Object) находится в предке всех классов, а различные IDE позволяют генерировать тело метода автоматически. Да еще и hascode автоматически генерировать, чтобы правильно работали коллекции типа Hashtable.


 
ferr ©   (2007-09-28 17:38) [43]

> а различные IDE позволяют генерировать тело метода автоматически.
> Да еще и hascode автоматически генерировать, чтобы правильно
> работали коллекции типа Hashtable.

Что-то мне кажется что это дело компилятора а не ide.


 
Сергей М. ©   (2007-09-28 17:42) [44]


> Sandman31   (28.09.07 17:37) [42]



> Записывать в потоки, чтобы сравнить 2 объекта


Почему бы и нет, если свойств не так уж и много ?
Это по сути тот же циклический проход по опубликованным св-вом, но неявный.


> Метод equals(Object) находится в предке всех классов


Ничто не мешает реализовать его функц.аналог в данном случае.


 
Sandman31   (2007-09-28 17:44) [45]

ferr ©   (28.09.07 17:38) [43]

Программист может подкорректировать, если хочет.


 
Сергей М. ©   (2007-09-28 17:45) [46]


> Sandman31   (28.09.07 17:44) [45]


Кстати, наверняка существуют ДелфиIDE-эксперты, делающие то же самое.


 
Sandman31   (2007-09-28 17:46) [47]

Сергей М. ©   (28.09.07 17:42) [44]

Почему бы и нет, если свойств не так уж и много ?

1. Потому что происходят лишние операции. Особенно если отличия в первом поле.
2. Программист учится плохому :)


 
Sandman31   (2007-09-28 17:47) [48]

Сергей М. ©   (28.09.07 17:45) [46]

Надеюсь. Вот их и надо использовать, а не изобретать квадратное колесо.


 
KSergey ©   (2007-09-28 17:51) [49]

> Сергей М. ©   (28.09.07 17:42) [44]
> > Записывать в потоки, чтобы сравнить 2 объекта
> Почему бы и нет, если свойств не так уж и много ?

Да как бы это... Дороговасто, однако, получается. И памяти как минимум еще на 2 копи объекта надо...
не, комп. железный, конечно, но как-то это...


 
имя   (2007-10-07 22:11) [50]

Удалено модератором


 
имя   (2007-10-07 22:13) [51]

Удалено модератором



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

Форум: "Прочее";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.58 MB
Время: 0.043 c
15-1190321077
Суслик
2007-09-21 00:44
2007.11.04
VirtualPC and Other


2-1192018494
@!!ex
2007-10-10 16:14
2007.11.04
Указатель на самого себя.


15-1191262340
cber
2007-10-01 22:12
2007.11.04
В чём ошибка?


15-1191378171
Slider007
2007-10-03 06:22
2007.11.04
С днем рождения ! 3 октября 2007 среда


11-1175198781
ElectriC
2007-03-30 00:06
2007.11.04
a-la KeyPreview





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский