Ir para conteúdo

string.explode(str, char)


caotic

Posts Recomendados

Ola galera venho trazer a função string.explode ela ja existe mais resolvi fazer com os encantos do pog.

 

A função separa uma string por um carácter e depois ele e insertado numa table podendo assim manipular cada parte.

 

function string.explode(str, char)
k = 1
x = {}
i = 1
str = ""..str..""..char..""
while #str > k do
local t = string.sub(str, k, k)
if t == char then
table.insert(x, string.sub(str, i, k-1))
k = k+1
i = k
end
k = k+1
end
return x
end

 

str = "Ola,Oi,Sua,Vida,Taste, oi"
for i=1, #string.explode(str, ",") do
print(string.explode(str, ",")[i])
end

Link para o comentário
Compartilhar em outros sites

encantos do pog

 

Nope.

 

str = ""..str..""..char..""

 

2KC7XaB.jpg

 

str = str .. char

 

E isso não é gambiarra. Em linguagens de baixo/médio nível (C, C++, et cetera) o algoritmo é praticamente igual o seu. Essa solução também é mais eficiente do que a usada no open tibia. Você poderia deixar ela um pouco mais rápida gravando o caractere em uma string temporária e depois inserir essa string na tabela quando o separador ou o fim da string original fosse encontrado.

Editado por Skyen
Link para o comentário
Compartilhar em outros sites

encantos do pog

 

Nope.

 

str = ""..str..""..char..""

 

2KC7XaB.jpg

 

str = str .. char

Não entendo por que insiste em pogar '-'. Eu até fazia funções como essa ai quando eu tava começando a aprender Lua, só pra praticar string.sub, minha lógica e coisas como tipo. Mas não vejo por que tornar do POG um estilo de vida.

Link para o comentário
Compartilhar em outros sites

str = ""..str..""..char..""

MANO, SÓ DIGO UMA COISA PRA VC: string.rep("HUE",math.huge)

e eu acho q devia parar de tentar pogar, querendo ou nao isso ainda deixa o script 1 bosta e desnecessariamente complicado

flw

Link para o comentário
Compartilhar em outros sites

 str = ""..str..""..char.."" 

MANO, SÓ DIGO UMA COISA PRA VC: string.rep("HUE",math.huge) e eu acho q devia parar de tentar pogar, querendo ou nao isso ainda deixa o script 1 bosta e desnecessariamente complicado flw

 

Po cara e meu jeito de programar e isto ai.

Ninguém muda isto não.

 

Mais

....

Link para o comentário
Compartilhar em outros sites

Admito que nao consegui diminuir muito nao, mas fiz algumas versões:

function explode(str,div)
local x = {}
local m = string.explode(str,div)
for d = 1,#m do
table.insert(x,m[d])
end
return x
end

 

function explode(str,div)
return string.explode(str,div)
end

 

essa aqui é a mais gambiarrada

ela adiciona todos os caracteres num array e dps checa se o array é o char ai reseta a var mama e assim vai

function explode(str, char)
local tals = {}
local words = {}
for x = 1,string.len(str) do
table.insert(tals,string.sub(str,x,x))
end
local mama = ""
local bool = false
for x = 1,#tals do
if tals[x] ~= char then
mama = mama .. tals[x]
bool = true
else
table.insert(words,mama)
mama = ""
bool = false
end
end
if bool then
table.insert(words,mama)
end
return words
end

 

 

 

E a unica q fiz seriozinho:

function explode(str, char)
local found = {}
local bool = false
while(string.find(str,char) ~= nil) do
table.insert(found,string.sub(str,0,string.find(str,char)-1))
str = string.sub(str,string.find(str,char)+1,string.len(str))
bool = true
end
if bool and str ~= "" then
table.insert(found,str)
end
return found
end

 

 

 

nossa cara to vendo q string.sub é vida

alias, sirvo pra pogger? kkk

Editado por 20cm
Link para o comentário
Compartilhar em outros sites

Admito que nao consegui diminuir muito nao, mas fiz algumas versões:

function explode(str,div)
local x = {}
local m = string.explode(str,div)
for d = 1,#m do
table.insert(x,m[d])
end
return x
end

 

function explode(str,div)
return string.explode(str,div)
end

 

essa aqui é a mais gambiarrada

ela adiciona todos os caracteres num array e dps checa se o array é o char ai reseta a var mama e assim vai

function explode(str, char)
local tals = {}
local words = {}
for x = 1,string.len(str) do
table.insert(tals,string.sub(str,x,x))
end
local mama = ""
local bool = false
for x = 1,#tals do
if tals[x] ~= char then
mama = mama .. tals[x]
bool = true
else
table.insert(words,mama)
mama = ""
bool = false
end
end
if bool then
table.insert(words,mama)
end
return words
end

 

 

 

E a unica q fiz seriozinho:

function explode(str, char)
local found = {}
local bool = false
while(string.find(str,char) ~= nil) do
table.insert(found,string.sub(str,0,string.find(str,char)-1))
str = string.sub(str,string.find(str,char)+1,string.len(str))
bool = true
end
if bool then
table.insert(found,str)
end
return found
end

 

 

 

nossa cara to vendo q string.sub é vida

alias, sirvo pra pogger? kkk

 

 

Esta terceira fiko epica.

Insertar todas as caracteres para depois comparar todas.

Gostei ehauehauehaueh'

Link para o comentário
Compartilhar em outros sites

Minha versão com inclusão de retirada de espaços do inicio e depois dos separadores.


string.explode = function (str, sep)
   local ret = {}
   local str = str:gsub("^%s+", ""):gsub(sep.."%s+", sep)
   for result in string.gmatch(str, "(.-)".. sep) do
       str = str:gsub(result .. sep, "")
       table.insert(ret, result)
   end

   table.insert(ret, str)
   return ret
end

Em tempo de execução a minha e a sua estão praticamente iguais, já quanto ao gasto de memória a minha apresenta uma pequena diferença mas é devido a retirada dos espaços, ela está gastando mais memória que a sua.

 

str = ""..str..""..char..""

não faça isso em publico vei kk

 

anyway, boa função xD

Editado por dalvorsn
Link para o comentário
Compartilhar em outros sites

Minha versão com inclusão de retirada de espaços do inicio e depois dos separadores.
 string.explode = function (str, sep) local ret = {} local str = str:gsub("^%s+", ""):gsub(sep.."%s+", sep) for result in string.gmatch(str, "(.-)".. sep) do str = str:gsub(result .. sep, "") table.insert(ret, result) end table.insert(ret, str) return ret end 

Em tempo de execução a minha e a sua estão praticamente iguais, já quanto ao gasto de memória a minha apresenta uma pequena diferença mas é devido a retirada dos espaços, ela está gastando mais memória que a sua.

 str = ""..str..""..char.."" 

não faça isso em publico vei kk anyway, boa função xD

 

Usar gmatch e gusb e uma boa.

Além de que fico mais bonito sua função.

Entendi o sentindo e a execução da função parabéns.

O interessante que o procedimento e um pouco mais complicado porque você procura o separador e depois vai reformulando a string.

 

Fica mais bonito usar:

 

""..str..""..char..""

Editado por caotic
Link para o comentário
Compartilhar em outros sites

Usar gmatch e gusb e uma boa.

Além de que fico mais bonito sua função.

Entendi o sentindo e a execução da função parabéns.

O interessante que o procedimento e um pouco mais complicado porque você procura o separador e depois vai reformulando a string.

 

Fica mais bonito usar:

 

""..str..""..char..""

 

Eu fui reduzindo a string, pode ser que tenha sido um dos motivos do gasto a mais de memoria, farei depois com gfind e usando apenas a posição, e verei como fica o gasto de memoria, porque provavelmente sub gasta menos memoria que gsub e como o loop executa varias vezes dependendo da string, uma diferença pequena dentro dele pode se tornar uma grande diferença xD

 

 

-- #edit

com gfind fico bem mais rápida, segue o código:


string.explode = function (str, sep)

   local ret = {}
   local str = str:gsub("^%s+", ""):gsub(sep.."%s+", sep):gsub("%s+$","")
   local last = str:match(sep.."(.-)$")
   collectgarbage()

   for result in string.gfind(str, "(.-)".. sep) do
       table.insert(ret, result)
   end

   table.insert(ret, last)
   return ret
end

Editado por dalvorsn
Link para o comentário
Compartilhar em outros sites

minha versão :

 

string.explode = function (string, char)
local tab, pos = {}, 1
for str in string:gmatch(".") do
 pos = str == char and pos + 1
 tab[pos] = tab[pos] or ""
 tab[pos] = str == char or tab[pos] .. str
	end
return tab
end

Editado por xotservx
Link para o comentário
Compartilhar em outros sites

todo mundo fasendo verção de string.explode,vo fase uma tbm

 

fis rapidão,então nem me procupei com nome pra variveis a função

function s(a,b)
local tab = {}
for x in a:gmatch("[^"..b.."]+") do
  table.insert(tab,x)
end
return tab
end

@dalvorsn

só esqueceu de que tem a possibilidade de alguem usar "." como sep(tem sempre alguem a tentar fazer coisas do tipo)

 

onde(que programa) vcs testan o desempenho do script?

Link para o comentário
Compartilhar em outros sites

todo mundo fasendo verção de string.explode,vo fase uma tbm

 

fis rapidão,então nem me procupei com nome pra variveis a função

function s(a,b)
local tab = {}
for x in a:gmatch("[^"..b.."]+") do
  table.insert(tab,x)
end
return tab
end

@dalvorsn

só esqueceu de que tem a possibilidade de alguem usar "." como sep(tem sempre alguem a tentar fazer coisas do tipo)

 

onde(que programa) vcs testan o desempenho do script?

 

 

Todo mundo ta fazendo usando gmatch.

Em questão de praticidade ele e o melhor mesmo.

Link para o comentário
Compartilhar em outros sites

todo mundo fasendo verção de string.explode,vo fase uma tbm

 

fis rapidão,então nem me procupei com nome pra variveis a função

function s(a,b)
local tab = {}
for x in a:gmatch("[^"..b.."]+") do
  table.insert(tab,x)
end
return tab
end

@dalvorsn

só esqueceu de que tem a possibilidade de alguem usar "." como sep(tem sempre alguem a tentar fazer coisas do tipo)

 

onde(que programa) vcs testan o desempenho do script?

 

print no fim do script isso:

print(string.format("Memory: %f, Clock: %f", collectgarbage("count"), os.clock()))

 

Realmente passou despercebido que pode entrar no separador caracteres mágicos, muito bem lembrado ;D

Link para o comentário
Compartilhar em outros sites

@dalvorsn

gfind n é gmatch?(procurei no no site,diz que numa atulização gfind passou a ser gmatch)

ou tem alguma diferença

nunca tinha visto achei que era alguma função nova das libs de ot.

Link para o comentário
Compartilhar em outros sites

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...