БД содержит равкоды юнитов, хранится в хэше.
Какие есть варианты проверить содержится ли уже такое значение в БД, кроме перебора?

Принятый ответ

avuremybe, как тебе такой вариант?
	function HaveItem takes unit shop, integer itemid returns boolean
		return LoadBoolean(ht, GetUnitUserData(shop), itemid)
	endfunction

	function ShopAddItem takes unit shop, integer itemid returns nothing
		if not HaveItem(shop, itemid) then
			//...
			set lastItem = lastItem + 1
			call SaveInteger(ht, GetUnitUserData(shop), lastItem, itemid)
			call SaveBoolean(ht, GetUnitUserData(shop), itemid, true)
			//...
		endif
	endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
16
7 лет назад
0
Clamp, то есть вариантов кроме перебора нет?
0
30
7 лет назад
0
avuremybe, если опишешь, как и для чего используется БД, то мб появится.
0
28
7 лет назад
0
avuremybe, если бд хранит равкоды то записывай по равкоду в хэш булен
и потом проверяй его
ну а вообще кламп дело говорит
бд в студию
0
16
7 лет назад
Отредактирован avuremybe
0
Clamp, так ведь описал же. В БД хранятся целые числа. Вопрос стоит в том, каким методом, кроме перебора я могу проверять, лежит в этой БД конкретное число или нет.
Т.е. у меня есть какие-то данные
    call SaveInteger(udg_ht, GetUnitUserData(u), StringHash("I"+I2S(1)), 'U000')
    call SaveInteger(udg_ht, GetUnitUserData(u), StringHash("I"+I2S(2)), 'U001')
    call SaveInteger(udg_ht, GetUnitUserData(u), StringHash("I"+I2S(3)), 'U002')
и если я хочу туда добавить, например 'U001', то хотелось бы знать, может он там уже есть.
local itemCount=3
local i=1
loop
    exitwhen i>itemCount
    if (LoadInteger(udg_ht, GetUnitUserData(u), StringHash("I"+I2S(i)))=='U001') then
    ...
    endif
    set i=i+1
endloop

StringHash() я на целые числа заменю, не вопрос. Но это текущую задачу не решает =\
0
30
7 лет назад
0
Что мешает использовать сами эти числа в качестве childKey и просто сохранять туда boolean true? Тогда можно добавлять сколько угодно раз, по сути будет перезаписыватся единственная ячейка.
Как и указал нвц
0
16
7 лет назад
Отредактирован avuremybe
0
Clamp, это наполнение магазинов/инвентарей. Нужна последовательная нумерация.
Иначе у меня страница магазина будет формироваться туеву хучу времени.
0
30
7 лет назад
0
В таком случае название "БД" неуместно, в рантайме из базы данных значения только выгружаются.
Делай структурами и храни данные в них, это будет и удобнее, и проще.
Кроме того, при заполнении можно создавать каждому магазину/инвентарю свой пул всех доступных предметов и переносить предметы из него, а не копировать.
0
16
7 лет назад
Отредактирован avuremybe
0
Clamp, так у меня и есть свой пул доступных предметов для каждого юнита.
Там же parentKey - GetUnitUserData().
А чем удобнее и проще то?
Даже используя структуры, я все равно упрусь в то, что при покупке/поднятии юнитом предмета у которого есть стаки, мне нужно перелопатить весь его инвентарь, чтобы узнать, надо создавать новую ячейку или добавить в существующую.
То есть единственное преимущество структуры над хэш-таблицей - это разница в скорости обращения к глобалке и к хэшу. И на сколько я знаю, она не велика.
0
23
7 лет назад
0
чем не угодил индификатор зависимости от максимального количеств слота ?? вот пример

globals
	public constant integer MAX_UNIT_STATES = 100
endglobals

struct TypeUnit
        private static hashtable type_units
        
        public static constant integer KEY_STATE_TYPE = 0
        public static constant integer KEY_STATE_VALUE = 1
        
        readonly integer state_count = 0
        
        static method operator [] takes integer id returns thistype
            return LoadInteger(thistype.type_units, 0, id)
        endmethod
        
        static method create takes integer id returns thistype
            local thistype this = thistype.allocate()
            call SaveInteger(thistype.type_units, 0, id, this)
            return this
        endmethod
        
        public method addState takes State s, integer v returns nothing
            call SaveInteger(thistype.type_units, this, KEY_STATE_TYPE * MAX_UNIT_STATES + state_count, s)
            call SaveInteger(thistype.type_units, this, KEY_STATE_VALUE * MAX_UNIT_STATES + state_count, v)
            set state_count = state_count + 1
        endmethod
        
        public method getStateType takes integer i returns State
            return LoadInteger(thistype.type_units, this, KEY_STATE_TYPE * MAX_UNIT_STATES + i)
        endmethod
        
        public method getStateValue takes integer i returns integer
            return LoadInteger(thistype.type_units, this, KEY_STATE_VALUE * MAX_UNIT_STATES + i)
        endmethod
        
        private static method onInit takes nothing returns nothing
            set thistype.type_units = InitHashtable()
            call BJDebugMsg("type_units: " + I2S(GetHandleId(thistype.type_units)))
        endmethod
    endstruct
Вот так легче и удобно подбирать циклом... ясно что это пример но реализовать ясно
Циклом легче подбирать если такого есть хеша счетчик
Подбор цико вот как выглядит...
// i = 0
// tu = TypeUnit[unit id]
// item = null
loop
            exitwhen i == tu.state_count 
    
            set item = tu.getStateType(i)
                
			тут уже знаем предмет или что хотите шаманите
            
             set i = i + 1
        endloop
0
30
7 лет назад
0
А чем удобнее и проще то?
Не попробуешь - не узнаешь =)
2
7
7 лет назад
Отредактирован Ige
2
avuremybe, как тебе такой вариант?
	function HaveItem takes unit shop, integer itemid returns boolean
		return LoadBoolean(ht, GetUnitUserData(shop), itemid)
	endfunction

	function ShopAddItem takes unit shop, integer itemid returns nothing
		if not HaveItem(shop, itemid) then
			//...
			set lastItem = lastItem + 1
			call SaveInteger(ht, GetUnitUserData(shop), lastItem, itemid)
			call SaveBoolean(ht, GetUnitUserData(shop), itemid, true)
			//...
		endif
	endfunction
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.