Гость
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Массив - как убрать одинаковые значения / 25 сообщений из 26, страница 1 из 2
19.04.2009, 18:49
    #35941006
leokolus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
собственно то что в теме - как убрать повторяющиеся значения в массиве или в лист боксе, есть мысль загнать сначала в датастор и там применить Дистинкт но можно ли это и как реализовать - пожалуйста ваши варианты как это сделать.
Заранее очень благодарен
...
Рейтинг: 0 / 0
19.04.2009, 19:39
    #35941018
sPaul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
Каким образом значения попали в массив или листбокс?
...
Рейтинг: 0 / 0
20.04.2009, 14:19
    #35942052
Riska
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
leokolusкак это сделать?
Да как угодно! :)
...
Рейтинг: 0 / 0
20.04.2009, 21:09
    #35942944
leokolus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
sPaul

Массив набирается в цикле при чтении файла

Riska спасибо за предметный ответ, но хотелось бы по конкретнее
...
Рейтинг: 0 / 0
20.04.2009, 22:30
    #35943050
maxATC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
leokolusпожалуйста ваши варианты как это сделать
Один из вариантов.
leokolusзагнать сначала в датастор и там применить Дистинкт
...
Рейтинг: 0 / 0
21.04.2009, 01:42
    #35943202
leokolus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
maxATC

как Дистинкт применить к датосторе?
...
Рейтинг: 0 / 0
21.04.2009, 10:14
    #35943490
maxATC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
leokolus maxATC
как Дистинкт применить к датосторе?
Правильный вопрос, по поводу реализации данного, тупо вставка в датосторе на даст этого, надо через таблицу. Делаете таблицу, загоняете туда данные из файла, а уж на основе данной таблицы делаете датосторе с SQL запросом содержащим Дистинкт. Не лучший вариант , но работать будет
...
Рейтинг: 0 / 0
21.04.2009, 10:15
    #35943491
Dmitry..
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
сортируешь датастор,

потом цикл по всем строкам от последней до первой:
если значение строки i совпадает со значением i-1, то удаляем ее.
...
Рейтинг: 0 / 0
21.04.2009, 11:28
    #35943698
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
Dmitry..сортируешь датастор,

потом цикл по всем строкам от последней до первой:
если значение строки i совпадает со значением i-1, то удаляем ее.
Проще сортировка и группировка по нужному столбцу.
...
Рейтинг: 0 / 0
21.04.2009, 11:46
    #35943751
Dmitry..
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
AISПроще сортировка и группировка по нужному столбцу.
может быть, но тогда надо будет строить цикл для выборки данных из датастор с использованием ф-ции findGroupChange (или как ее там % хелпа под рукой нет)
...
Рейтинг: 0 / 0
21.04.2009, 14:52
    #35944537
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
leokolus sPaul
Массив набирается в цикле при чтении файла
А может прямо при чтении проверять, что если значение уже присутствует в массиве, то не добавлять его ?
...
Рейтинг: 0 / 0
21.04.2009, 15:12
    #35944600
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
ASCRUSleokolus sPaul
Массив набирается в цикле при чтении файла
А может прямо при чтении проверять, что если значение уже присутствует в массиве, то не добавлять его ?
Тогда надо сразу в DS загружать данные из файла (т.е. без цикла), где в подвязанном DWObject уже сформировано то, что нужно. При необходимости доделать ещё что-то и выгрузить в массив. А может и использовать DS если не так важно иметь данные в массиве.
...
Рейтинг: 0 / 0
21.04.2009, 16:07
    #35944799
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
А какого типа данные? Минимальное/максимальное значение? Общее количиство значений, число уникальных значений. Известно ли про это что-нибудь?
...
Рейтинг: 0 / 0
21.04.2009, 17:22
    #35945070
maxATC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
Возможен и такой вариант (конечно при нем могут быть и ограничения и если только цифровые значения).
Считываем данные файла в массив, i-товое значение будет значение считываемое из файла. Например считываем значение 135 в массиве он будет находиться в таком виде, массив[135] = 135, т.е. тут убиваем сразу дублирующие значения, т.к. следующее 135 попадет туда же. Далее узнаем размерность и в цикле пишем в другой массив, пропуская пустые i-товые значение. Конечно не идеал, т.к. первоначальный массив вырастит до размерности максимального числа в файле, и время цикла выборки также будет зависеть от макс. числа. Но если не большое макс.число, то тоже как вариант.
...
Рейтинг: 0 / 0
21.04.2009, 18:53
    #35945361
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
Вот так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
$PBExportHeader$n_cst_deduplicator.sru
forward
global type n_cst_deduplicator from datastore
end type
end forward

global type n_cst_deduplicator from datastore
end type
global n_cst_deduplicator n_cst_deduplicator

type variables
protected:

string DW_SYNTAX_START
string DW_SYNTAX_END = ' name=sorter dbname="sorter") )'
end variables

forward prototypes
protected function long dedupe (ref any avalues[])
public function long of_dedupe_array (ref integer arr[])
public function long of_dedupe_array (ref long arr[])
public function long of_dedupe_array (ref string arr[])
public function long of_dedupe_array (ref double arr[])
end prototypes

protected function long dedupe (ref any avalues[]);/*------------------------------------------------------------------------------

 Function:			protected n_cst_deduplicator.Dedupe

 Returns:         Long

 Parameters:      reference Any avalues[]

 Copyright ©2004 DTI - Philip Salgannik

 Date Created: 2/24/2004

 Description:	
 
--------------------------------------------------------------------------------
 Modifications:
 Date            Author              Comments
------------------------------------------------------------------------------*/
IF IsNull(avalues) THEN RETURN  0 
If UpperBound(avalues) <  2  THEN RETURN  0 
long ll_dups
string ls_type, ls_dsdef, ls_err
Reset()
Choose Case ClassName(avalues[ 1 ])
	Case "long", "unsignedlong", "ulong", "int","integer", "uint","unsignedinteger","unsignedint", "double"
		ls_type = "number"
	Case "char", "character", "string"
		ls_type = "char(4000)"
	CASE ELSE
		//excercise for the reader
		RETURN  0 
END CHOOSE

ls_dsdef = DW_SYNTAX_START + ls_type + DW_SYNTAX_END
IF Create(ls_dsdef, ls_err) <>  1  THEN RETURN - 1 			

object.sorter.Primary = avalues

SetSort("sorter A")
Sort()

SetFilter("sorter <> sorter[-1] or GetRow () = 1" )
Filter()

ll_dups = FilteredCount()

IF ll_dups >  0  THEN 
	avalues = object.sorter.Primary
END IF

RETURN ll_dups
end function

public function long of_dedupe_array (ref integer arr[]);/*------------------------------------------------------------------------------

 Function:			public n_cst_deduplicator.of_Dedupe_array

 Returns:         Integer

 Parameters:      reference Integer arr[]

 Copyright ©2004 DTI - Philip Salgannik

 Date Created: 2/24/2004

 Description:	
 
--------------------------------------------------------------------------------
 Modifications:
 Date            Author              Comments
------------------------------------------------------------------------------*/
IF IsNull (arr) THEN RETURN - 1 
long ll_dups
any temp[]
temp = arr
ll_dups = dedupe(temp)
IF ll_dups  >  0  THEN	
	arr = temp	
END IF

RETURN ll_dups

end function

public function long of_dedupe_array (ref long arr[]);IF IsNull (arr) THEN RETURN - 1 
long ll_dups
any temp[]
temp = arr
ll_dups = dedupe(temp)
IF ll_dups  >  0  THEN	
	arr = temp	
END IF

RETURN ll_dups

end function

public function long of_dedupe_array (ref string arr[]);/*------------------------------------------------------------------------------

 Function:			public n_cst_deduplicator.of_Dedupe_array

 Returns:         Long

 Parameters:      reference String arr[]

 Copyright ©2004 DTI - Philip Salgannik

 Date Created: 2/24/2004

 Description:	
 
--------------------------------------------------------------------------------
 Modifications:
 Date            Author              Comments
------------------------------------------------------------------------------*/
IF IsNull (arr) THEN RETURN - 1 
long ll_dups
any temp[]
temp = arr
ll_dups = dedupe(temp)
IF ll_dups  >  0  THEN	
	arr = temp	
END IF

RETURN ll_dups

end function

public function long of_dedupe_array (ref double arr[]);IF IsNull (arr) THEN RETURN - 1 
long ll_dups
any temp[]
temp = arr
ll_dups = dedupe(temp)
IF ll_dups  >  0  THEN	
	arr = temp	
END IF

RETURN ll_dups

end function

on n_cst_deduplicator.create
call super::create
TriggerEvent( this, "constructor" )
end on

on n_cst_deduplicator.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on

event constructor;/*------------------------------------------------------------------------------

 Event   :			 n_cst_deduplicator.Constructor

 Returns:         Long

 Parameters:      

 Copyright ©2004 DTI - Philip Salgannik

 Date Created: 2/24/2004

 Description:	pbm_constructor
 
--------------------------------------------------------------------------------
 Modifications:
 Date            Author              Comments
------------------------------------------------------------------------------*/
Environment le_env

GetEnvironment(le_env)


DW_SYNTAX_START = 'release ' + String(le_env.PBMajorRevision) + '; datawindow() table(column=(type='

end event

...
Рейтинг: 0 / 0
21.04.2009, 20:12
    #35945514
maxATC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
Филипп,
green fingers
...
Рейтинг: 0 / 0
21.04.2009, 20:29
    #35945536
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
maxATCФилипп,
green fingers
Не понял. Акромя как с кином с аналогичным назвванием, это у меня ни с чем не ассоциируется...
...
Рейтинг: 0 / 0
21.04.2009, 20:56
    #35945557
maxATC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
Филипп,

А что так уже не называют разве в Америке людей, которые по ассоциации в России имеют название золотые руки, или просто не знали?
...
Рейтинг: 0 / 0
21.04.2009, 21:05
    #35945568
maxATC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
Филип,
Если интересует как исторически произошло это и откуда взялось, могу написать, если Вам интересно.
...
Рейтинг: 0 / 0
21.04.2009, 21:27
    #35945590
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
В Америке как правило говорят Green Thumb (в единственном числе). Так же как и Green Fingers , это означает врожденное умение садовничать , и ни в каком другом смысле не употребляется...
...
Рейтинг: 0 / 0
21.04.2009, 21:54
    #35945624
maxATC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
Филипп,
Ну и в России от ныне не услышишь похвалы "золотые руки", многие сейчас и не поймут, еще и в морду дадут за оскорбление. Прошу извинение у уважаемых модераторов за разведенный флуд.
...
Рейтинг: 0 / 0
22.04.2009, 10:23
    #35946153
ChV
ChV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
Век живи - век учись.
Филипп.......
SetFilter("sorter <> sorter[-1] or GetRow () = 1" )
.......
Красиво. Спасибо пригодится.

Good Luck !
...
Рейтинг: 0 / 0
22.04.2009, 16:02
    #35947499
leokolus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
уважаемый Филипп, большое спасибо за объект но я никак не соображу как им пользоваться пробую так

string ls_primery[]

n_cst_deduplicator ln_cst_deduplicator
ll_q = ln_cst_deduplicator.of_dedupe_array(ls_primery)

но выскакивает ошибка Null object reference at line....

плиз помогите разобраться
...
Рейтинг: 0 / 0
22.04.2009, 17:10
    #35947778
maxATC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
n_cst_deduplicator ln_cst_deduplicator
ln_cst_deduplicator= CREATE n_cst_deduplicator
ll_q = ln_cst_deduplicator.of_dedupe_array(ls_primery)
DESTROY ln_cst_deduplicator
...
Рейтинг: 0 / 0
22.04.2009, 18:35
    #35948140
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив - как убрать одинаковые значения
Ну и должно быть понятно, что можно было не пижонить, создать прямо в paintere external dataobject с колонками всех типов и совать в (и сортировать/фильтровать) соответствующую. Но так как-то элегантнее :-)
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Массив - как убрать одинаковые значения / 25 сообщений из 26, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]