On-line: Мирослав, гостей 2. Всего: 3 [подробнее..]
АвторСообщение
администратор




Пост N: 3506
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.09.13 13:14. Заголовок: Сравнить массивы


Где то вроде была тема но не найду
Нужно сравнить массивы чем проще тем лучше
Вот такой фокус не работает.
a:={{23,.f.},{345,.t.}}
b:={{23,.f.},{345,.t.}}
? a==b // .f.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 6 [только новые]


Администратор




Пост N: 2972
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 03.09.13 13:48. Заголовок: Надо сравнивать поэл..


Надо сравнивать поэлементно. Можно с использованием рекурсии
Примерно так:

Function AComp(a1, a2)
Local lRet := .t., i

if len(a1) == len(a2)
for i := 1 to len(a1)
if ValType(a1[ i ]) = 'A' .and. ValType(a2[ i ]) = 'A'
if ! AComp(a1[ i ], a2[ i ])
lRet := .f.
exit
endif
elseif ! (a1[ i] == a2[ i ])
lRet := .f.
exit
endif
next
else
lRet := .f.
endif
Return lRet


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3507
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.09.13 13:52. Заголовок: Так и думал. Спасибо..


Так и думал. Спасибо.
Считал есть что то уже готовое в Harbour.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2973
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 03.09.13 13:58. Заголовок: Харбор сравнивает сс..


Харбор сравнивает ссылки на массивы. Т.е

Local a1 := {...}
Local a2 := a1

? a1 == a2
вернет .t.
в остальных случаях - .f.

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 262
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 03.09.13 16:20. Заголовок: Dima пишет: a:={{23..


Dima пишет:

 цитата:
a:={{23,.f.},{345,.t.}}
b:={{23,.f.},{345,.t.}}
? a==b // .f.



В данном случае - это сравнение адресов. Это идет еще из Clipper - все массивы передаются только по ссылкам.

1) Сделать функцию сравнения двух элементов массива. Тк банальное a[1] == b[1] может дать ошибку, если в одном из них дата, а в другом - число. Или еще один массив.
2) Начать со сравнения длин.
3) Если равны - вызвать AEVAL с "безопасной" функцией (1)
4) Если сравниваемые элементы являются массивам - вызвать рекурсивно (3).

--

Другой способ: у меня есть пара функций "сворачивания" массива в строку и "разворачивания" обратно. Работает с вложенными массивами без вопросов. Когда-то нужен был способ сохранения массива в файл.

Если речь идет о небольших массивах - сравнить две строки, результаты их преобразования.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3509
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.09.13 16:28. Заголовок: Sergy пишет: Когда-..


Sergy пишет:

 цитата:
Когда-то нужен был способ сохранения массива в файл


Да есть такой способ FT_SAVEARR(FT_RESTARR)
В принципе для этой задачи мне бы хватило и что то типа HB_ArrayId , но это не то конечно
так как Pid будет разный даже если массивы одинаковы.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3511
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.09.13 17:53. Заголовок: Вот так вот работает..


Вот так вот работает (сравнение строк идет)

 
proc main
a:={{23,.f.},{345,.t.}}
b:={{23,.f.},{345,.t.}}

? ValToPrgExp(a)==ValToPrgExp(b) //.t.


return


Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 233
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет