Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
How can I align 2 arrays?
#1
ex.

a1=

AA
BB
DD
EE
GG

a2=

AA
BB
CC
EE
FF

a1_align=

AA
BB

DD
EE

GG

a2_align=

AA
BB
CC

EE
FF
GG


Code:
Copy      Help
AA AA
BB BB
___CC
DD
EE EE
___FF
GG GG
#2
Give this a try:

Macro Align Arrays
Code:
Copy      Help
str a1=
;AA
;BB
;DD
;EE
;GG

str a2=
;AA
;BB
;CC
;EE
;FF

ARRAY(str) a b
a=a1; b=a2
ARRAY(str) c.create(a.len*2)
ARRAY(str) d.create(b.len*2)
int i j=0; int k=0
for i 0 a.len
,if (StrCompare(a[i] b[i])<0)
,,c[j]=a[i]
,,k+1; d[k]=b[i]
,,j+1; c[j]=""
,else if (StrCompare(a[i] b[i])=0)
,,c[j]=a[i]
,,d[k]=b[i]
,else
,,d[k]=b[i]
,,j+1; c[j]=a[i]
,,k+1; d[k]=""
,j+1; k+1

c.redim(j); d.redim(k)
a=c; b=d;
c.redim; d.redim
out
for i 0 a.len
,out "a[%i]= %s" i a[i]
out ""
for i 0 b.len
,out "b[%i]= %s" i b[i]
#3
Thanks, but I tried:

str a1=
1
2
6
7
8

str a2=
3
4
5
6
7

and the result:

a[0]= 1
a[1]=
a[2]= 2
a[3]=
a[4]=
a[5]= 6
a[6]=
a[7]= 7
a[8]=
a[9]= 8

b[0]=
b[1]= 3
b[2]=
b[3]= 4
b[4]= 5
b[5]=
b[6]= 6
b[7]=
b[8]= 7
b[9]=
#4
Try this for integer arrays:

Macro Align Int Arrays
Code:
Copy      Help
str a2=
;1
;2
;6
;7
;8

str a1=
;3
;4
;5
;6
;7

ARRAY(str) a b
a=a1; b=a2
ARRAY(str) c.create(a.len*10)
ARRAY(str) d.create(b.len*10)
int i j k
for i 0 a.len
,j=val(a[i])
,c[j-1]=j

for i 0 b.len
,k=val(b[i])
,d[k-1]=k
,
if (j+1>k)
,c.redim(j); d.redim(j)
else
,c.redim(k); d.redim(k)
a=c; b=d;
c.redim; d.redim
out
for i 0 a.len
,out "a[%i]= %s" i a[i]
out ""
for i 0 b.len
,out "b[%i]= %s" i b[i]
#5
Thanks again, but I tried:

str a1=
AA
BB
FF
GG
HH

str a2=
CC
DD
EE
FF
GG

and the result:

a[0]= AA
a[1]=
a[2]= BB
a[3]=
a[4]=
a[5]= FF
a[6]=
a[7]= GG
a[8]=
a[9]= HH

b[0]=
b[1]= CC
b[2]=
b[3]= DD
b[4]= EE
b[5]=
b[6]= FF
b[7]=
b[8]= GG
b[9]=
#6
Try this for string arrays:

Macro Align String Arrays
Code:
Copy      Help
str a2=
;AA
;BB
;FF
;GG
;HH

str a1=
;CC
;DD
;EE
;FF
;GG

ARRAY(str) a b
a=a1; b=a2
ARRAY(str) c.create(a.len*4)
ARRAY(str) d.create(b.len*4)
int i j k; int base=65

for i 0 a.len
,j=a[i][0]-base
,c[j]=a[i]

for i 0 b.len
,k=b[i][0]-base
,d[k]=b[i]

if(j>k) c.redim(j+1); d.redim(j+1)
else c.redim(k+1); d.redim(k+1)

a=c; b=d;
c.redim; d.redim
out
for i 0 a.len
,out "a[%i]= %s" i a[i]
out ""
for i 0 b.len
,out "b[%i]= %s" i b[i]
#7
Thanks again, but the function I'm looking for is to align words to compare them (not just basing on the first letter).
#8
quick, raw and dirty, but seems to fit the bill


************************************************************

Macro Macro15
Code:
Copy      Help
out

str a1=
;AA
;BB
;DD
;EE
;GG

str a2=
;AA
;BB
;CC
;EE
;FF

ARRAY(str) AA1 AA2 A1al A2al

IStringMap m._create
m.Flags=1
AA1=a1
AA2=a2
int i=AA1.len
for _i 0 i
,m.Add(AA1[_i] AA2[_i])
str sk sv
m.EnumBegin
rep    
,if(!m.EnumNext(sk sv)) break
,if(sk=sv)
,,A1al[]=sk
,,A2al[]=sk
,,continue
,A1al[]=sk
,A2al[]="___"
,A1al[]="___"
,A2al[]=sv
m.EnumEnd

for _i 0 A1al.len
,out "%s %s" A1al[_i] A2al[_i]

****************************************

hope this helps.....
#9
Thanks to all.
What most approximates what I want is:

Macro alinear_arrays
Code:
Copy      Help
str columna1=
;test1
;test5
;test9

str columna2=
;test1
;test3
;test8
;test9


columna1.eliminar_lineas_vacias;columna2.eliminar_lineas_vacias
columna1.ordenar; columna2.ordenar
ARRAY(str) columna1_a=columna1
ARRAY(str) columna2_a=columna2
int i
ARRAY(str) columna_suma columna1_final_a columna2_final_a
str t3=F"{columna1}[]{columna2}"
t3.eliminar_lineas_vacias;t3.ordenar
t3.RemoveDuplicateLines
columna_suma=t3
int lsuma=columna_suma.len
columna1_final_a.create(lsuma)
columna2_final_a.create(lsuma)
int contador=columna1_a.len-1
for i lsuma-1 -1 -1
,if(find(columna1 columna_suma[i] 0 1)>=0)
,,columna1_final_a[i]=columna1_a[contador]
,,contador-1
,else
,,columna1_final_a[i]=""
str c=columna1_final_a

contador=columna2_a.len-1
for i lsuma-1 -1 -1
,if(find(columna2 columna_suma[i] 0 1)>=0)
,,columna2_final_a[i]=columna2_a[contador]
,,contador-1
,else
,,columna2_final_a[i]=""
str d=columna2_final_a

out c
out ".-.-.-.-.-.-"
out d

Perhaps there is a more elegant way to do it ...


Forum Jump:


Users browsing this thread: 1 Guest(s)