Just nu i M3-nätverket
Gå till innehåll

Att ta ut skillnaderna mellan 2 arrayer


Admini

Rekommendera Poster

Hej

Om vi har 2 arrayer så här:

 

Array_1

array_1(0)="buss"

array_1(1)="tåg"

array_1(2)="cykel"

 

Array_2

array_2(0)="buss"

array_2(1)="bil"

array_2(2)="tåg"

array_2(3)="båt"

array_2(4)="cykel"

 

Och jag vill ta ut skillnaderna dvs.

bil

båt

 

Hur gör jag?

Tack

 

Länk till kommentar
Dela på andra webbplatser

Ja, en variant är att för varje position i Array_1, får du jämföra det värdet med varje position i Array_2.

Så om du börjar med buss i Array_1 så får du loopa igenom Array_2 för att se om det finns där. Finns det inte så lägg det i en variabel eller i en ny array. Stega sen till tåg i Array_1 och gör samma loopa igenom Array_2. Finns inte värdet så lägg till det i variabeln eller den nya Array:n. Kanske inte den mest resurssnåla varianten men men...

 

Länk till kommentar
Dela på andra webbplatser

En bättre variant är att först loopa igenom den längsta arrayen och lägga in varje värde i en Dictionary. Därefter loopas den andra arrayen igenom och använder dictionaryns Exists-metod för att kontrollera om elementet existerar i den andra, lägga annars i en tredje lista (av valfritt format, förslagsvis även den en dictionary för att slippa redimma en array i varje steg)

 

Den metoden får en komplexitet på O(m+n), istället för O(m*n) som Mickes variant ger upphov till.

 

För små listor är det hugget som stucket vilket du väljer. Mickes metod kanske t.o.m är att föredra i de fallen, men för långa listor skall du använda min metod.

 

Länk till kommentar
Dela på andra webbplatser

Ni svarade redan igår och jag har ännu inte fått email om det. jag blir sååå trött...

Bevakningsmail fungerar överhuvudtaget inte för mig, då vår mailserver inte godkänner de mailheaders som idg använder sig av =/

 

Kan du ge ett exempelkod, för jag har försökt med detta utan framgång.tack!

Vems variant var det du ville ha exempel på, min eller Mickes?

 

 

 

Länk till kommentar
Dela på andra webbplatser

Det var Mickes jag menade men du är också välkommen med tips.

Hur jag än vänder och vrider på det så blir det inte rätt.

 

Länk till kommentar
Dela på andra webbplatser

 

det är är min kod:

For i=0 To 4
For j=0 To 3
	If array_1(i) = array_2(j) Then
	Response.Write array_1(i)&" finns.<br>"
	Else
	saknade(i)=array_1(i)
	End If
Next
Next

 

Länk till kommentar
Dela på andra webbplatser

Du får försöka bevaka tråden manuellt istället för att förlita dig på mail, annars blir det svårt att få följdsvar på viktiga frågor.

 

Följande funktion ger mängden av element ur unionen av mängderna som inte finns i snittet av dem. Inte säker på om det var det du ville ha, du kanske ville ha den relativa komplement-mängden (A-B) istället? Du har en timme på dig att säga till isåfall ;)

 

 

Function GetSetDifference(arrA,arrB)
Set oD=Server.CreateObject("Scripting.Dictionary")
For i=0 To UBound(arrA)
	oD.Add arrA(i),""
Next
For i=0 To UBound(arrB)
	If oD.Exists(arrB(i)) Then
		oD.Remove(arrB(i))
	Else
		oD.Add arrB(i),""
	End If
Next
GetSetDifference=oD.Keys
End Function

 

 

 

Länk till kommentar
Dela på andra webbplatser

Det är A-B jag vill ha, men vad får jag utav "Följande funktion ger mängden av element ur unionen av mängderna som inte finns i snittet av dem"?

 

 

Länk till kommentar
Dela på andra webbplatser

men vad får jag utav "Följande funktion ger mängden av element ur unionen av mängderna som inte finns i snittet av dem"?

 

A-> Båt Bil Hus Hund

B -> Båt Bil Katt

-------------------------------------------------------

Unionen av A och B -> Båt Bil Hus Hund Katt

Snittet av A och B -> Båt Bil

 

Union - Snitt -> Hus Hund Katt

 

A-B -> Hus Hund

B-A -> Katt

 

 

 

[inlägget ändrat 2006-10-20 15:32:41 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Då är det A-B jag vill ha :)

 

Kan den göras utan att använda sig av Scripting.Dictionary?

[inlägget ändrat 2006-10-20 15:38:45 av Admini]

Länk till kommentar
Dela på andra webbplatser

Ok, här kommer då relativa komplementet av B i A, eller enklare uttryckt A-B:

 

Följande ger alltså arrA-arrB

[color="#0000ff"]Function[/color] GetRelativeComplement(arrA,arrB)
[color="#0000ff"]Set[/color] oD=[b]Server[/b].[color="#0000ff"]CreateObject[/color]([GRÅ]"Scripting.Dictionary"[/GRÅ])
[color="#0000ff"]For[/color] i=0 [color="#0000ff"]To[/color] [color="#0000ff"]UBound[/color](arrA)
	oD.Add arrA(i),[GRÅ]""[/GRÅ]
[color="#0000ff"]Next[/color]
[color="#0000ff"]For[/color] i=0 [color="#0000ff"]To[/color] [color="#0000ff"]UBound[/color](arrB)
	[color="#0000ff"]If[/color] oD.Exists(arrB(i)) [color="#0000ff"]Then[/color]
		oD.Remove(arrB(i))
	[color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
[color="#0000ff"]Next[/color]
GetRelativeComplement=oD.Keys
[color="#0000ff"]End[/color] [color="#0000ff"]Function[/color]

 

EDIT: Som du ser är båda funktionerna O(m+n) vilket är klart bättre än O(m*n)

 

[inlägget ändrat 2006-10-20 15:40:54 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Kan den göras utan att använda sig av Scripting.Dictionary?

Inte utan att hamna i O(m*n) som sagt. Vad är problemet med dictionary?

 

Länk till kommentar
Dela på andra webbplatser

Jag vill bara få reda på vad jag gjorde för fel.

Ok, lämnar den felsökningen till Micke, då det var hans förslag; nu har jag uppfyllt min del av kontraktet ;)

 

[inlägget ändrat 2006-10-20 15:53:22 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Jo, problemet är att en a arrayerna är ett recordset och jag vet inte riktigt hur jag ska ta itu med den.

Hur skriver jag om den här satsen:

For i=0 To UBound(arrA)

om arrA är ett recordset

 

Länk till kommentar
Dela på andra webbplatser

Isåfall använder du GetRows för att föra över recordsetet till en array:

 

arrData=rs.GetRows()

Detta skall du dock göra innan du har börjat bläddra i det (eller, om det inte är ett forward-only recordset, flytta cursorn till början först)

 

Länk till kommentar
Dela på andra webbplatser

Så här kanske:

 

Function GetRelativeComplement(arrA,arrB)
Set oD=Server.CreateObject("Scripting.Dictionary")
For i=0 To UBound(rs.GetRows())
oD.Add rs.(i),""
Next
For i=0 To UBound(tabeller)
If oD.Exists(tabeller(i)) Then
oD.Remove(tabeller(i))
End If
Next
GetRelativeComplement=oD.Keys
End Function 

 

 

 

Länk till kommentar
Dela på andra webbplatser

Du ska undvika globala variabler inne i funktionen, det är inte snyggt =)

Använd funktionen som den såg ut och anropa den med

 

 

arrNy=GetRelativeComplement(rs.GetRows(),tabeller)

 

Länk till kommentar
Dela på andra webbplatser

Använd funktionen som den såg ut och anropa den med

 

arrNy=GetRelativeComplement(rs.GetRows(),tabeller)

 

Hur skriver jag ut dem på skärmen sedan?

 

Response.Write ...

 

Länk till kommentar
Dela på andra webbplatser

Hur skriver jag ut dem på skärmen sedan?

Tja, du får tillbaka en vanlig array, så:

For i=0 To UBound(arrNy)
Response.Write arrNy(i) & "<br>"
Next

 

Länk till kommentar
Dela på andra webbplatser

Jag får fel:

Subscript out of range
oD.Add arrA(i),[GRÅ]""[/GRÅ]

 

Här är hela koden:

[color="#0000ff"]ReDim[/color] tabeller(5)
tabeller(0)=[GRÅ]"huvudmeny"[/GRÅ]
tabeller(1)=[GRÅ]"reklam"[/GRÅ]
tabeller(2)=[GRÅ]"medlemmar"[/GRÅ]
tabeller(3)=[GRÅ]"kommentar"[/GRÅ]
tabeller(4)=[GRÅ]"senaste"[/GRÅ]

[color="#0000ff"]Set[/color] rs=conn.[color="#0000ff"]Execute[/color]([GRÅ]"SHOW TABLES"[/GRÅ])

[color="#0000ff"]Function[/color] GetRelativeComplement(arrA,arrB)
[color="#0000ff"]Set[/color] oD=[b]Server[/b].[color="#0000ff"]CreateObject[/color]([GRÅ]"Scripting.Dictionary"[/GRÅ])
[color="#0000ff"]For[/color] i=0 [color="#0000ff"]To[/color] [color="#0000ff"]UBound[/color](arrA)
oD.Add arrA(i),[GRÅ]""[/GRÅ]
[color="#0000ff"]Next[/color]
[color="#0000ff"]For[/color] i=0 [color="#0000ff"]To[/color] [color="#0000ff"]UBound[/color](arrB)
[color="#0000ff"]If[/color] oD.Exists(arrB(i)) [color="#0000ff"]Then[/color]
oD.Remove(arrB(i))
[color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
[color="#0000ff"]Next[/color]
GetRelativeComplement=oD.Keys
[color="#0000ff"]End[/color] [color="#0000ff"]Function[/color]

arrNy=GetRelativeComplement(rs.GetRows(),tabeller)
[color="#0000ff"]For[/color] i=0 [color="#0000ff"]To[/color] [color="#0000ff"]UBound[/color](arrNy)
[b]Response[/b].Write arrNy(i) & [GRÅ]"<br>"[/GRÅ]
[color="#0000ff"]Next[/color]

[inlägget ändrat 2006-10-20 16:34:46 av Admini]

Länk till kommentar
Dela på andra webbplatser

Jag får fel:

 

Subscript out of range

oD.Add arrA(i),""

Det är ju inte så konstigt, du har dimensionerat arrayen för ett element mer än du lagt in i den. Det finns helt enkelt inget element tabeller(5). Det skall alltså vara:

[color="#0000ff"]ReDim[/color] tabeller(4)

 

Nu försvinner jag tyvärr för kvällen.

 

[inlägget ändrat 2006-10-20 16:40:01 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Nu försvinner jag tyvärr för kvällen

 

Ska du ut o festa? :thumbsup:

 

tack för hjälpen!

 

 

Gå inte än!

Jag får samma fel!!!

[inlägget ändrat 2006-10-20 16:42:40 av Admini]

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...