Avatar billede skywalkerdk Nybegynder
10. august 2003 - 19:10 Der er 41 kommentarer og
1 løsning

Arrays, opsummering af søgeresultater

Jeg har 4 arrays. Hvert array kan indeholde et eller flere tal, eksempelvis:

Første array:
900
670
560

Andet array:
900
123
321

Da dette er søgeresultater skal jeg have sammenlignet alle arrays med hinanden og (evt. via et nyt array) samlet de tal der går igen i alle arrays.
Avatar billede eagleeye Praktikant
10. august 2003 - 19:15 #1
Har de samme længde så kan du lavet noget i stil med:

for i = lbound(arr1) to ubound(arr1)
  if arr1(i) = arr2(i) then
    'De to celler er ens i begge array

  end if
next


Eller skal den tjekke at et tal kan være i hele arrayet og ikke i samme celle id?
Avatar billede somaliomar Praktikant
10. august 2003 - 19:21 #2
Eller prøv:

for i = lbound(arr1) to ubound(arr1)
  for i2 = lbound(arr2) to ubound(arr2)
    if arr1(i) = arr2(i2) then
      'Der er en match
    end if
  next i2
next i
Avatar billede somaliomar Praktikant
10. august 2003 - 19:23 #3
Sådan skal ovenstående kode se ud:

for i = lbound(arr1) to ubound(arr1)
  for i2 = lbound(arr2) to ubound(arr2)
    if arr1(i) = arr2(i2) then
      'Der er en match
    end if
  next
next
Avatar billede skywalkerdk Nybegynder
10. august 2003 - 19:25 #4
Tallene i arrayene kan være 1,2 eller 3 cifrede.
Avatar billede skywalkerdk Nybegynder
10. august 2003 - 19:25 #5
Længden af arrayene varierer også.
Avatar billede eagleeye Praktikant
10. august 2003 - 19:29 #6
Ok, så prøv sådan her, der bliver lavet et arr3 som indeholder alle de tal som findens i begge arrays arr1 og arr2:


<%
str1 = "900,54,500"
str2 = "900,500,234,54"

arr1 = Split(str1,",")
arr2 = Split(str2,",")
redim arr3(0)

for i = lbound(arr1) to ubound(arr1)
  for t = lbound(arr2) to ubound(arr2)
    if arr1(i) = arr2(t) then
      arr3(ubound(arr3)) = arr1(i)
      redim preserve arr3(ubound(arr3)+1)
    end if
  next
next
if ubound(arr3) > 0 then redim preserve arr3(ubound(arr3)-1)

for i = lbound(arr3) to ubound(arr3)
  Response.write arr3(i) & "<br>"
next
%>
Avatar billede skywalkerdk Nybegynder
10. august 2003 - 19:31 #7
Jamen, jeg har jo 4 arrays ialt..?
Avatar billede nmh Nybegynder
10. august 2003 - 19:32 #8
Hvis de 4 tabeller kaldes A1, A2, A3 og A4

s1=join(A1,",")
s2=join(A2,",")
Avatar billede eagleeye Praktikant
10. august 2003 - 19:32 #9
skal alle 4 sammenligned med hinanden?
Avatar billede nmh Nybegynder
10. august 2003 - 19:34 #10
Ups, jeg kom til at sende for tidligt.
glem det. Jeg kommer med noget om lidt.
Avatar billede nmh Nybegynder
10. august 2003 - 19:43 #11
Dim B, s, s2, s3, s4
s2="," & join(A2,",") & ","
s3="," & join(A3,",") & ","
s4="," & join(A4,",") & ","
for i=Lbound(A1) to Ubound(A2)
  if instr(s2, "," & A1(i) & ",")>0 and ... and ...
              således fortsættes med s3 og s4  then
    s=s & "," & A1(i)
  end if
B=split(s,",")
nu inndeholder tabellen (eller arrayet) B de elementer, der er med i alle 4 tabeller
Øvre grænse for B: er Ubound(B) nedre er 0.
Avatar billede nmh Nybegynder
10. august 2003 - 19:44 #12
rettelse:
efter end if og før B=split(s,",") skal tilføjes et next
Avatar billede nmh Nybegynder
10. august 2003 - 19:49 #13
ny rettelse (det er ikke gost at sidde at skrive direkte ind her)
for i=Lbound(A1) to Ubound(A1)
skal det selv følgelig være.
Her er det igen:

Dim B, s, s2, s3, s4
s2="," & join(A2,",") & ","
s3="," & join(A3,",") & ","
s4="," & join(A4,",") & ","
for i=Lbound(A1) to Ubound(A1)
  if instr(s2, "," & A1(i) & ",")>0 and instr(s3,...) and instr(s4,...) then             
    s=s & "," & A1(i)
  end if
next
B=split(s,",")
nu indeholder tabellen (eller arrayet) B de elementer, der er med i alle 4 tabeller
Øvre grænse for B: er Ubound(B) nedre er 0.
Avatar billede nmh Nybegynder
10. august 2003 - 20:11 #14
Her er min endelige version med en lille forbedring og en rettelse (der kom et komma for meget med):
Dim B, s, s2, s3, s4
s2="," & join(A2,",") & ","
s3="," & join(A3,",") & ","
s4="," & join(A4,",") & ","
for i=Lbound(A1) to Ubound(A1)
  if instr(s2, "," & A1(i) & ",")>0 then
    if instr(s3, "," & A1(i) & ",")>0 then
      if instr(s4, "," & A1(i) & ",")>0 then           
        s=s & "," & A1(i)
      end if
    end if
  end if
next
s=mid(s,2)
B=split(s,",")

Nu indeholder tabellen B alle de tal, der er i alle 4 tabeller.
Avatar billede eagleeye Praktikant
10. august 2003 - 20:14 #15
Her så skal dine 4 arrys baer hedder:  arr1, arr2, arr3, arr4
navne kan du lave om så prøv denne kode.
Den laver et array arrEns  men alle der er ens:


strArr = Join(arr1,",") & "," & Join(arr2,",") & "," & Join(arr3,",") & "," & Join(arr4,",")
arr = Split(strArr,",")
str = "," & strArr & ","
nyStr = ","
sindex = inStr(1,str,",")
for i = lbound(arr) to ubound(arr)
  sindex = inStr(sindex+1,str,",")
  if inStr(sindex, str,"," & arr(i) & ",") > 0 then
    if inStr(1,nyStr,"," & arr(i) & ",") = 0 then
      nyStr = nyStr & arr(i) & ","
    end if
  end if
next

if len(nyStr) > 1 then
  nyStr = Mid(nyStr,2,len(nyStr)-2)
  arrEns = Split(nyStr,",")
  for i = lbound(arrEns) to ubound(arrEns)
    Response.write arrEns(i) & "<br>"
  next
end if
Avatar billede nmh Nybegynder
10. august 2003 - 20:33 #16
eagleeye>>Men er opgaven ikke at finde de elementer, der forekommer i alle 4 tabeller?
Får du ikke et element med, hvis det er med 2 gange i arr1 og ellers ikke forekommer?
Avatar billede eagleeye Praktikant
10. august 2003 - 20:46 #17
Hmm ja det muligt. Jeg er ikke helt klar over hvad opgaven er, men det lavet sådan at hvis et element er i to arrays kommer det med.

Ja jeg får faktisk et element med hvis det er to gange i samme array uden det er i de andre :)
Avatar billede nmh Nybegynder
10. august 2003 - 21:09 #18
Til gengæld vil min programstump kunne få et element med flere gange i B, hvis det forekommer flere gange i A1 og i alle de andre også.
Hvis dette ikke må ske skal
s=s & "," & A1(i)
ændres til
if inStr(s & "," , "," & A1(i) & ",")=0 then
  s=s & "," & A1(i)
end if
Avatar billede skywalkerdk Nybegynder
11. august 2003 - 14:46 #19
Øhm, det dur ikke hvis den tager et element med fordi det går igen i 2 eller 3 af arrayene, det skal gå igen i ALLE 4 for at være gældende.
Avatar billede nmh Nybegynder
11. august 2003 - 14:48 #20
Men den løsning, jeg har lavet, gør lige præcis det du ønsker.
Avatar billede skywalkerdk Nybegynder
11. august 2003 - 14:50 #21
Arrayene kan desuden være tomme
Avatar billede skywalkerdk Nybegynder
11. august 2003 - 14:51 #22
ok, prøver lige igen
Avatar billede nmh Nybegynder
11. august 2003 - 14:55 #23
Hvis der er tomme tabeller burde min løsning sørge for, at B-tabellen er tom.
Avatar billede nmh Nybegynder
11. august 2003 - 14:58 #24
du skal bruge løsningen 10/08-2003 20:11:59
evt med ændringen 10/08-2003 21:09:38.
Er der problemer, kan den let rettes til.
Avatar billede skywalkerdk Nybegynder
11. august 2003 - 14:59 #25
Din funktion virker kanon bortset fra at den ikke tager højde for tomme arrays.

Hvis et array er tomt skal den se bort fra det og ikke anvende det i sorteringen.

(Du har fået point)
Avatar billede nmh Nybegynder
11. august 2003 - 15:02 #26
Jeg takker for point.
Tom tabel: Skal man så kun benytte de ikke tomme tabeller?
Avatar billede skywalkerdk Nybegynder
11. august 2003 - 15:05 #27
Ja, kun de tabeller med indhold skal benyttes i sorteringen.
Avatar billede skywalkerdk Nybegynder
11. august 2003 - 15:06 #28
Her er koden jeg anvender:

Dim B, s, s2, s3, s4
s2="," & join(ResHus,",") & ","
s3="," & join(ResPersoner,",") & ","
s4="," & join(ResDyr,",") & ","
for i=Lbound(ResUge) to Ubound(ResUge)
  if instr(s2, "," & ResUge(i) & ",")>0 then
    if instr(s3, "," & ResUge(i) & ",")>0 then
      if instr(s4, "," & ResUge(i) & ",")>0 then           
        s=s & "," & ResUge(i)
      end if
    end if
  end if
next
s=mid(s,2)
B=split(s,",")
Avatar billede nmh Nybegynder
11. august 2003 - 15:13 #29
Hvad gør du så, hvis en tabel er tom?
Et forslag, som dog ikke er helt effektivt:
Erstat de tomme tabeller med en af de ikke tomme (helst den korteste).
Avatar billede skywalkerdk Nybegynder
11. august 2003 - 15:20 #30
Jeg har jo et problem med de tomme.
Kan du putte et tjek ind i koden ovenfor som tjekker om et array er tomt?
Jeg kan ikke lige gennemskue hvor den evt. skal ind.

Ellers har jeg lavet en variabel for hver array der returnere en "true" hvis arrayet har indhold og ellers en "false".
Avatar billede nmh Nybegynder
11. august 2003 - 16:05 #31
Jeg vil komme med et forslag senest engang i aften.
Jeg har ikke tid lige nu.
Avatar billede nmh Nybegynder
11. august 2003 - 18:18 #32
Den simple men ikke helt kønne løsning
(nu er jeg blevet bidt af poblemet, så jeg laver måske en pænere):

Lav 4 variable Tom1,...,Tom4, som er "false" hvis den tilsvarende tabel er tom og ellers "true".
Vi får også brug for at arbejde med et dynamisk array A0 og 4 nye variable t1, t2, t3, t4:
dim A0, t1, t2, t3, t4
t1=join(ResUge,",")
t2=join(ResHus,",")
t3=join(ResPersoner,",")
t4=join(ResDyr,",")

if Tom1 then
  if Tom2 then
    if Tom3 then
      if Tom4 then
        'Alt er tomt, og så stopper festen
      else
        A0=split(t4,",")
      end if
    else
      A0=split(t3,",")
    end if
  else
    A0=split(t2,",")
  end if
else
  A0=split(t1,",")
end if

Nu er A0 ikke tom og er lig den første af tabellerne, der ikke er tom.

for-løkken skal nu starte således:

for i=Lbound(A0) to Ubound(A0)

De 3 if-sætninger i for-løkken ovenfor ændres til
if Tom2 or instr(s2, "," & ResUge(i) & ",")>0 then
if Tom3 or instr(s3, "," & ResUge(i) & ",")>0 then
if Tom4 or instr(s4, "," & ResUge(i) & ",")>0 then

Det skulle være det hele.
Avatar billede skywalkerdk Nybegynder
11. august 2003 - 18:46 #33
Øhm.. var det sådan her du mente?
Jeg får en type mismatch.
Du må gerne få nogle flere point.

dim A0, t1, t2, t3, t4
t1=join(ResUge,",")
t2=join(ResHus,",")
t3=join(ResPersoner,",")
t4=join(ResDyr,",")

if ResUgeR then
  if ResHusR then
    if ResPersonerR then
      if ResDyrR then
        'Alt er tomt, og så stopper festen
      else
        A0=split(t4,",")
      end if
    else
      A0=split(t3,",")
    end if
  else
    A0=split(t2,",")
  end if
else
  A0=split(t1,",")
end if

Dim B, s, s2, s3, s4
s2="," & join(ResHus,",") & ","
s3="," & join(ResPersoner,",") & ","
s4="," & join(ResDyr,",") & ","
for i=Lbound(A0) to Ubound(A0)
  if ResHusR or instr(s2, "," & ResUge(i) & ",")>0 then
    if ResPersonerR or instr(s3, "," & ResUge(i) & ",")>0 then
      if ResDyrR or instr(s4, "," & ResUge(i) & ",")>0 then
        s=s & "," & ResUge(i)
      end if
    end if
  end if
next
s=mid(s,2)
B=split(s,",")
Avatar billede nmh Nybegynder
11. august 2003 - 18:57 #34
Hvor får du en type mismatch?
Lagde du mærke til at mine variable tom1, tom2,... skal være sande, hvis tabellen er tom og ellers falsk?
Har du lavet ResHusR, ResUgeR... sådan?
Du skal også vælge, hvordan du skal reagere, hvis alle 4 tabeller er tomme.
Ups. Nu ser jeg fejlen:
ResUge(i) skal nu være A0(i).
Det står der 4 steder i for-løkken.
Du har nok ladet ResUge være tom?
Nu er det A0, det handler om.
Avatar billede nmh Nybegynder
11. august 2003 - 18:58 #35
mht flere point: 200 er maksimum i følge reglerne.
Avatar billede skywalkerdk Nybegynder
11. august 2003 - 19:45 #36
Ok, nu har jeg vendt mine true - false variabler og udskiftet det du skrev.
Får stadig en Type mismatch 'join' på linien med "t2=join(ResHus,",")".

dim A0, t1, t2, t3, t4
t1=join(ResUge,",")
t2=join(ResHus,",")
t3=join(ResPersoner,",")
t4=join(ResDyr,",")

if ResUgeR then
  if ResHusR then
    if ResPersonerR then
      if ResDyrR then
        'Alt er tomt, og så stopper festen
      else
        A0=split(t4,",")
      end if
    else
      A0=split(t3,",")
    end if
  else
    A0=split(t2,",")
  end if
else
  A0=split(t1,",")
end if

Dim B, s, s2, s3, s4
s2="," & join(ResHus,",") & ","
s3="," & join(ResPersoner,",") & ","
s4="," & join(ResDyr,",") & ","
for i=Lbound(A0) to Ubound(A0)
  if ResHusR or instr(s2, "," & A0(i) & ",")>0 then
    if ResPersonerR or instr(s3, "," & A0(i) & ",")>0 then
      if ResDyrR or instr(s4, "," & A0(i) & ",")>0 then
        s=s & "," & A0(i)
      end if
    end if
  end if
next
s=mid(s,2)
B=split(s,",")
Avatar billede skywalkerdk Nybegynder
11. august 2003 - 19:47 #37
Tror det er fordi den prøver at bruge ResHus som nogle gange er tom.
Avatar billede nmh Nybegynder
11. august 2003 - 19:57 #38
Så lav testen
if Ubound(ResHus)=-1 then
  ResHusR=True
  t2=""
end if
og tilsvarende med de andre. Så får du samtidig tildelt værdier til de boolske variable.
Avatar billede skywalkerdk Nybegynder
11. august 2003 - 20:11 #39
Nedenstående returnerer fejlen:
Type mismatch: 'Ubound'
line 213
Linie 213 er "if Ubound(ResHus)=-1 then".

if Ubound(ResUge)=-1 then
  ResUgeR=True
  t1=""
end if

if Ubound(ResHus)=-1 then
  ResHusR=True
  t2=""
end if

if Ubound(ResPersoner)=-1 then
  ResPersonerR=True
  t3=""
end if

if Ubound(ResDyr)=-1 then
  ResDyrR=True
  t4=""
end if

dim A0, t1, t2, t3, t4
if ResUgeR then t1=join(ResUge,",")
if ResHusR then t2=join(ResHus,",")
if ResPersonerR then t3=join(ResPersoner,",")
if ResDyrR then t4=join(ResDyr,",")

if ResUgeR then
  if ResHusR then
    if ResPersonerR then
      if ResDyrR then
        'Alt er tomt, og så stopper festen
      else
        A0=split(t4,",")
      end if
    else
      A0=split(t3,",")
    end if
  else
    A0=split(t2,",")
  end if
else
  A0=split(t1,",")
end if

Dim B, s, s2, s3, s4
s2="," & join(ResHus,",") & ","
s3="," & join(ResPersoner,",") & ","
s4="," & join(ResDyr,",") & ","
for i=Lbound(A0) to Ubound(A0)
  if ResHusR or instr(s2, "," & A0(i) & ",")>0 then
    if ResPersonerR or instr(s3, "," & A0(i) & ",")>0 then
      if ResDyrR or instr(s4, "," & A0(i) & ",")>0 then
        s=s & "," & A0(i)
      end if
    end if
  end if
next
s=mid(s,2)
B=split(s,",")
Avatar billede skywalkerdk Nybegynder
11. august 2003 - 20:18 #40
Godt jeg har fusket.
Fyldt alle de tomme arrays med data fra de andre.
Case closed.
Hvis du er interesseret i noget freelance programmering så smid mig en mail på skywalkerNOSPAM@imma.dk. Fjern NOSPAM.
Avatar billede nmh Nybegynder
11. august 2003 - 20:22 #41
Hvordan får du skabt dine 4 tabeller ResUge ,...
Hvordan ser en tom tabel ud?
Jeg brugte Ubound(A)=-1 fordi  det var tilfældet hvi jeg skabte A ved at bruge split på en tom streng.
Så mit forslag til test af en tom tabel dur ikke.
Dine test if ResUgeR then ....
skal være if not ResUgeR then t1=...
Avatar billede nmh Nybegynder
11. august 2003 - 20:27 #42
Din løsning med at fylde de tomme med data fra de andre, var jo netop det, jeg forsøgte, men testen på tom duede altså ikke.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester