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

Att ta ut skillnaderna mellan 2 arrayer

Rekommendera Poster

Admini

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

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Micke_skane

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...

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Anjuna Moon

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.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

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

tack!

 

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

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

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Anjuna Moon
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?

 

 

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

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.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

 

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

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Anjuna Moon

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

 

 

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

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"?

 

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Anjuna Moon
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]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

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]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Anjuna Moon

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]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Anjuna Moon
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?

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini
Vad är problemet med dictionary?

 

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

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Anjuna Moon
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]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

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

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Anjuna Moon

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)

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

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 

 

 

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Anjuna Moon

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)

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini
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 ...

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Anjuna Moon
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

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

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]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Anjuna Moon
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]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini
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]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Skapa ett nytt konto på vårt forum. Det är lätt!

Registrera ett nytt konto

Logga in

Redan medlem? Logga in här.

Logga in nu



×
×
  • Skapa nytt...