Witam.
Mógłby ktoś podrzucić kod na usuwanie duplikatów z tablicy?
Chodzi o to że mam system wczytywania i po wczytaniu w tablicy są duplikaty. Używam Array
Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
|
Najlepsza odpowiedź GwynBleidD, 07.09.2014 14:53
specialtrie.inc
#include <cellarray> #include <celltrie> new Array:g_STrieArray; new Trie:g_STrieTrie; /** Inicjalizuje STrie z podaną długością klucza */ stock STrie_init(keysize=1) { g_STrieArray = ArrayCreate(keysize=1); g_sTrieTrie = TrieCreate(); } /** Dodaje klucz na koniec sTrie * zwraca 1 przy powodzeniu, 2 gdy klucz już istnieje. */ stock STrie_pushString(const key[], const value[]) { if (TrieKeyExists(g_STrieTrie, key) return 2; TrieSetString(g_STrieTrie, key, value); ArrayPushString(g_STrieArray, key); return 1; } /** Pobiera klucz z podanej pozycji */ stock STrie_getKey(item, output[], size) { return ArrayGetString(g_STrieArray, item, output, size); }
Prosty include z 3 stockami. Resztę funkcji, jeśli jest Ci potrzebna, dopiszesz sobie już sam na tym przykładzie. Oczywiście są trochę ułomne, bo nie da się stworzyć 2ch takich struktur w 1 pluginie, ale pokazuję w ten sposób tylko, że nie jest to wcale trudne.
Użycie bardzo proste: inicjalizujesz w plugin_init (pamiętaj o określeniu największej długości klucza), zapisujesz nowe wartości gdzie chcesz i przy odczytywaniu lecisz pętlą od 0 do maksymalnej wielkości tablicy, odczytując z niej klucze poprzez getKey. Wartości jeśli nie są Ci potrzebne, wpisz po prostu pusty string.
Przejdź do postuNapisano 27.08.2014 17:19
Witam.
Mógłby ktoś podrzucić kod na usuwanie duplikatów z tablicy?
Chodzi o to że mam system wczytywania i po wczytaniu w tablicy są duplikaty. Używam Array
Napisano 27.08.2014 17:39
new g_FirstString[64], g_SecondString[64]; for(new i = 0; i < ArraySize(g_Array); i++){ ArrayGetString(g_Array, i, g_FirstString, charsmax(g_FirstString)); for(new g = i + 1; g < ArraySize(g_Array); g++){ ArrayGetString(g_Array, g, g_SecondString, charsmax(g_SecondString)); if(equal(g_FirstString, g_SecondString)){ ArrayDeleteItem(g_Array, g); g--; } } }
If you can dream it, you can do it.
Napisano 27.08.2014 17:45
Tak myślałem że trzeba zagnieżdżone pętle, ale nie mogłem ogarnąć tych Arrayow .
A mógłbyś na zwykłe tablice pokazać mi?
Napisano 27.08.2014 18:04
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
Napisano 27.08.2014 20:22
Napisano 27.08.2014 23:30
Chodzi o to że mam system wczytywania i po wczytaniu w tablicy są duplikaty
To zrob sprawdzanie przy wczytywaniu pod katem istnienia konkretnych danych, zamiast ladowac wszystko a pozniej przetwarzac tablice na nowo.
Ogolnie niestety PAWN jest bardzo tandetny w kwestii zmiennych / tablic i operacjach, np. w PHP to o czym mowisz jest banalne, a tutaj stawia poprzeczke juz na jakimstam poziomie choc wiem ze PHP to zupelnie wziety z nieba przyklad do porownania.
Użytkownik Puchate edytował ten post 27.08.2014 23:31
Napisano 28.08.2014 05:58
Napisano 28.08.2014 09:18
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
Napisano 02.09.2014 18:07
Trie
Napisano 06.09.2014 20:43
Napisano 06.09.2014 21:43
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
Napisano 07.09.2014 13:01
Napisano 07.09.2014 13:35
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
Napisano 07.09.2014 13:50
Może rozjaśnie troche
Na początku wczytuje dane (nazwy), które się powtarzają (string). Potem jest tak, że muszę pętlą jechać po tej tablicy (dodaje do menu te dane) i sprawdzać czy element jest już dodany czy nie. Jako że duplikatów jest około 25, a nie-duplikatów 3, to stwierdziłem, że nie ma sensu jeździć po tych 28 elementach. Wymyśliłem żeby iterować tylko po tych nie duplikatach (3 opcje).
Pytać jak coś nie jasne.
Napisano 07.09.2014 14:33
a nie mozesz przy wczytywaniu sprawdzac czy elementu nie ma w tablicy? albo zrobic drugą tablice gdzie dodajesz element jesli go w niej nie ma?
Napisano 07.09.2014 14:53 Najlepsza odpowiedź
specialtrie.inc
#include <cellarray> #include <celltrie> new Array:g_STrieArray; new Trie:g_STrieTrie; /** Inicjalizuje STrie z podaną długością klucza */ stock STrie_init(keysize=1) { g_STrieArray = ArrayCreate(keysize=1); g_sTrieTrie = TrieCreate(); } /** Dodaje klucz na koniec sTrie * zwraca 1 przy powodzeniu, 2 gdy klucz już istnieje. */ stock STrie_pushString(const key[], const value[]) { if (TrieKeyExists(g_STrieTrie, key) return 2; TrieSetString(g_STrieTrie, key, value); ArrayPushString(g_STrieArray, key); return 1; } /** Pobiera klucz z podanej pozycji */ stock STrie_getKey(item, output[], size) { return ArrayGetString(g_STrieArray, item, output, size); }
Prosty include z 3 stockami. Resztę funkcji, jeśli jest Ci potrzebna, dopiszesz sobie już sam na tym przykładzie. Oczywiście są trochę ułomne, bo nie da się stworzyć 2ch takich struktur w 1 pluginie, ale pokazuję w ten sposób tylko, że nie jest to wcale trudne.
Użycie bardzo proste: inicjalizujesz w plugin_init (pamiętaj o określeniu największej długości klucza), zapisujesz nowe wartości gdzie chcesz i przy odczytywaniu lecisz pętlą od 0 do maksymalnej wielkości tablicy, odczytując z niej klucze poprzez getKey. Wartości jeśli nie są Ci potrzebne, wpisz po prostu pusty string.
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
Napisano 22.09.2014 00:08
Wiem, że piszę post pod postem ale już mam tego serdecznie dość... Podbijasz wszystkie tematy w których dostałeś już odpowiedź, zamiast z niej po prostu skorzystać... Nie pasuje Ci odpowiedź? Napisz dlaczego! Nie umiesz jej użyć? Napisz gdzie nie rozumiesz! Chcesz mieć więcej metod "bo tak" albo po prostu Ci się nudzi? DAJ SOBIE SPOKÓJ! Bo specjalnie dla Ciebie nie będzie każdy czytał po Nty raz tego samego tematu, tylko dlatego, że masz widzimisię żeby je non stop podbijać... A w tym temacie dostałeś już gotową odpowiedź na kilka sposobów, w tym zalążek biblioteki, którą sobie możesz poprawić i rozwinąć pod własne potrzeby, korzystając tylko z dokumentacji otwartej gdzieś obok... Kod jest prosty i opiera się o użycie 2 modułów, które I TAK są zawsze ładowane, bo są wbudowane w amxx core. Wydajniejszej metody nie znajdziesz, bo w AMXX nie ma Trie ani podobnego bytu po którym można iterować. A pomysły z sortowaniem lub przeczesywaniem tablicy bez sortowania są beznadziejne i lepsze od w/w tylko wtedy, gdy masz pamięci RAM pod serwer na styk, ale procesorem możesz szastać...
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
0 użytkowników, 0 gości, 0 anonimowych