Just nu i M3-nätverket
Jump to content

Hitta dubletter


Admini

Recommended Posts

Äntligen hittar jag en genväg till att skriva ny tråd thumbsup.gif

 

Hej

Jag har en serie tal i en array:

3, 5, 6, 3, 6, 6

 

Där det förekommer dubletter och ibland fler av vissa av talen.

Nu vill jag skriva ut dem i en tabell så här:

 

| 3 | 2 |

| 5 | 1 |

| 6 | 3 |

 

talen i första kolumn och antalet i andra, men hur jag än gör så blir det så här:

 

| 3 | 2 |

| 5 | 1 |

| 6 | 3 |

| 3 | 2 |

| 6 | 3 |

| 6 | 3 |

 

Hur skriver jag min For-Loop så det ser ut som i tabell 1 ?

Tack på förhand

Link to comment
Share on other sites

Är det verkligen så svårt att ingen kan lösa detta?

Det känns som en enkel uppgift men jag kan just nu inte se lösningen.

Link to comment
Share on other sites

Hur populerar du din array?

Kanske kan du redan där hantera dubbletterna.

 

Hur ser din loop ut?

Antingen så får du i din loop kolla om du redan har skrivit ut just detta tal eller så använder du ett dictionary-objekt som du populerar från din array (och då använder Exists för att kolla om du redan har värdet i dictionaryn).

Link to comment
Share on other sites

Hur populerar du din array?

Kanske kan du redan där hantera dubbletterna.

 

Hur ser din loop ut?

Antingen så får du i din loop kolla om du redan har skrivit ut just detta tal eller så använder du ett dictionary-objekt som du populerar från din array (och då använder Exists för att kolla om du redan har värdet i dictionaryn).

 

 

Jag skriver Produkt-Ider till Cookies

Response.Cookies("kund")("prod"& sAntal)=ProduktId

 

Sedan i en annan sida läser jag från Cookies till en 2-dimentionell array för att kunna köra en loop.

 

 

iAnt=0
Redim strMulti(1,sAntal-1)
For i=0 To sAntal-1
For j=0 To sAntal-1
 If Request.Cookies("kund")("prod"&i) = Request.Cookies("kund")("prod"&j) Then
   iAnt=iAnt+1
 End If
Next

  strMulti(0,i)=Request.Cookies("kund")("prod"&i)
  strMulti(1,i)=iAnt

iAnt=0
Next

'--- Utskrift---'
For k=0 To sAntal-1
Response.Write "|" & strMulti(0,k) &"|"& strMulti(1,k) &"| <br>" 
Next

 

Men då ser det ut så här:

 

| 39|2|

| 3 |1|

| 39|2|

| 6 |1|

Link to comment
Share on other sites

Fick lite tid över så jag tog fram en funktion för att enkelt ta bort dubletter ur en array

Function RemoveDuplicatesInArray(arr)
If isArray(arr) Then
	For i=0 To UBound(arr)
		If Not(InArray(arr, arr(i), i)) Then
			tmpStr = tmpStr & arr(i) & ","
		End If
	Next
End If
If Len(tmpStr)>0 Then 
	RemoveDuplicatesInArray = Split(Left(tmpStr, Len(tmpStr)-1),",")
Else
	RemoveDuplicatesInArray = Array()
End If
End Function
Function InArray(arr, key, index)
InArray=True
For i=0 To index-1
	If arr(i)=key Then Exit Function
Next
InArray=False
End Function

arrUniqueValues = RemoveDuplicatesInArray(arrOriginalValues)

Link to comment
Share on other sites

Oj! vilket jobb! Tack

 

Jag vill inte verka otacksam, men det är inte mycket jag förstår i den här Function.

Anledningen är att jag inte jobbat med Function tidigare

 

Kan man inte göra detta enklare, så även jag förstår det unsure.gif ?

smile.gif

 

 

 

Link to comment
Share on other sites

Hmm... det var just för att göra det enklare (och återanvändbart) som jag använde en funktion för det :)

 

Säg att du har en array, med dubbletter i, som heter t.ex. myArr (varför du har str som suffix för din array strMulti förstår jag inte).

Då kan du köra den genom funktionen RemoveDuplicatesInArray för att få enbart unika värden:

myArr = RemoveDuplicatesInArray(myArr)

Link to comment
Share on other sites

myArr = RemoveDuplicatesInArray(myArr)

 

 

Du menar den sista raden, eller hur?

 

Det har jag gjort nu, men det funkar inte, jag får följande fel:

 

 

Webbplatsen kan inte visa sidan

HTTP 500

Mest sannolika orsaker:

  • Webbplatsen underhålls.
  • Det finns ett programmeringsfel i webbplatsen.

Link to comment
Share on other sites

Se till att alltid visa detaljerade felmeddelanden i din webbläsare när du utvecklar, det är så mycket enklare att felsöka då.

För Internet Explorer:

1. Klicka på Verktyg och välj Internetalternativ.

3. Klicka på fliken Avancerat och rulla ned till avsnittet Webbsökning.

4. Avmarkera kryssrutan Visa egna HTTP-felmeddelanden och klicka på OK.

http://windows.microsoft.com/sv-SE/windows-vista/Get-help-with-website-error-messages-HTTP-errors

 

Hur som helst. Du måste såklart ha med de två funktionerna som används:

Function RemoveDuplicatesInArray(arr)
If isArray(arr) Then
	For i=0 To UBound(arr)
		If Not(InArray(arr, arr(i), i)) Then
			tmpStr = tmpStr & arr(i) & ","
		End If
	Next
End If
If Len(tmpStr)>0 Then 
	tmpArr = Split(Left(tmpStr, Len(tmpStr)-1),",")
Else
	tmpArr = Array()
End If
RemoveDuplicatesInArray = tmpArr
End Function

Function InArray(arr, key, index)
InArray=True
For i=0 To index-1
	If arr(i)=key Then Exit Function
Next
InArray=False
End Function

Sen anropar du RemoveDuplicatesInArray

Link to comment
Share on other sites

Det har jag gjort nu, men då går den in i en evighetsloop, för fläkten går på högvarv och ingenting händer på sidan.

 

Här är hela koden:

 

 

<%
Redim arr(5)
For i=0 To 4
arr(i) = Request.Cookies("kund")("prod"&i)
Next
%>

<%
Function RemoveDuplicatesInArray(arr)    	
If isArray(arr) Then
 For i=0 To UBound(arr)
  If Not(InArray(arr, arr(i), i)) Then
  tmpStr = tmpStr & arr(i) & ","
  End If
 Next
End If
If Len(tmpStr)>0 Then
tmpArr = Split(Left(tmpStr, Len(tmpStr)-1),",")
Else
tmpArr = Array()
End If
RemoveDuplicatesInArray = tmpArr
End Function

Function InArray(arr, key, index)
InArray=True
For i=0 To index-1
 If arr(i)=key Then Exit Function
Next
InArray=False
End Function
arr = RemoveDuplicatesInArray(arr)
%>

Link to comment
Share on other sites

Ok, jag har lagt in lite felhantering i funktionerna

Function RemoveDuplicatesInArray(arr)
If isArray(arr) Then
	For i=0 To UBound(arr)
		If Trim(arr(i)&" ")<>"" Then
			If Not(InArray(arr, arr(i), i)) Then
				tmpStr = tmpStr & arr(i) & ","
			End If
		End If
	Next
End If
If Len(tmpStr)>0 Then 
	tAr = Split(Left(tmpStr, Len(tmpStr)-1),",")
Else
	tAr = Array()
End If
RemoveDuplicatesInArray = tAr
End Function

Function InArray(arr, key, index)
If isArray(arr) Then
	InArray=True
	For i=0 To index-1
		If arr(i)=key Then Exit Function
	Next
Else
	InArray=False
	Exit Function
End If
InArray=False
End Function

Dock måste du ge arrayen utan dubletter ett nytt namn, typ:

arrUniqueValues = RemoveDuplicatesInArray(arr)

eller något annat passande

Link to comment
Share on other sites

Ok, jag har lagt in lite felhantering i funktionerna

Function RemoveDuplicatesInArray(arr)
If isArray(arr) Then
	For i=0 To UBound(arr)
		If Trim(arr(i)&" ")<>"" Then
			If Not(InArray(arr, arr(i), i)) Then
				tmpStr = tmpStr & arr(i) & ","
			End If
		End If
	Next
End If
If Len(tmpStr)>0 Then 
	tAr = Split(Left(tmpStr, Len(tmpStr)-1),",")
Else
	tAr = Array()
End If
RemoveDuplicatesInArray = tAr
End Function

Function InArray(arr, key, index)
If isArray(arr) Then
	InArray=True
	For i=0 To index-1
		If arr(i)=key Then Exit Function
	Next
Else
	InArray=False
	Exit Function
End If
InArray=False
End Function

Dock måste du ge arrayen utan dubletter ett nytt namn, typ:

arrUniqueValues = RemoveDuplicatesInArray(arr)

eller något annat passande

 

 

Nej.

Evighetsloop igen! sad.gif

Link to comment
Share on other sites

Ok, vet inte vad du gör som får det att spåra ut.

Nedan visar jag vad som fungerar finfint för mig:

<%
Function RemoveDuplicatesInArray(arr)
If isArray(arr) Then
	For i=0 To UBound(arr)
		If Trim(arr(i)&" ")<>"" Then
			If Not(InArray(arr, arr(i), i)) Then
				tmpStr = tmpStr & arr(i) & ","
			End If
		End If
	Next
End If
If Len(tmpStr)>0 Then 
	tAr = Split(Left(tmpStr, Len(tmpStr)-1),",")
Else
	tAr = Array()
End If
RemoveDuplicatesInArray = tAr
End Function

Function InArray(arr, key, index)
If isArray(arr) Then
	InArray=True
	For i=0 To index-1
		If arr(i)=key Then Exit Function
	Next
Else
	InArray=False
	Exit Function
End If
InArray=False
End Function

' Skapa en array med dubbletter
arrOriginalValues = Array(3,5,6,12,2,6,4,6,2,1,8,7,3,9,9,2,2,6,11,7,10,12)

' Skapa en ny array utan dubbletter
arrUniqueValues = RemoveDuplicatesInArray(arrOriginalValues)

' Utskrifter för att testa
IF isArray(arrOriginalValues) THEN
Response.Write "<p>Värden i ursprunglig array:<br>"
For i = 0 To uBound(arrOriginalValues)
	Response.Write "["& arrOriginalValues(i) &"] "
Next
Response.Write "</p>"
END IF

IF isArray(arrUniqueValues) THEN
Response.Write "<p>Värden i array utan dubletter:<br>"
For i = 0 To uBound(arrUniqueValues)
	Response.Write "["& arrUniqueValues(i) &"] "
Next
Response.Write "</p>"
END IF
%>

Link to comment
Share on other sites

Ok nu funkar det och jag får detta utskrift:

 

 

Värden i ursprunglig array:

[3] [5] [6] [12] [2] [6] [4] [6] [2] [1] [8] [7] [3] [9] [9] [2] [2] [6] [11] [7] [10] [12]

 

Värden i array utan dubletter:

[3] [5] [6] [12] [2] [4] [1] [8] [7] [9] [11] [10]

 

Men jag ville ju visa antalet förekomster av varje tal enligt nedan:

| 3 | 2 |

| 5 | 1 |

| 6 | 4 |

|12| 2 |

| 2 | 4 |

| 4 | 1 |

| 1 | 1 |

| 8 | 1 |

| 7 | 2 |

| 9 | 2 |

|11| 1 |

|10| 1 |

Link to comment
Share on other sites

Ok nu funkar det [...] Men jag ville ju visa antalet förekomster av varje tal [...]
Ah, det hade jag missat, då hade det nog varit lättast att köra med ett dictionary objekt från början:
<%
' Skapa en array med dubbletter
arrOriginalValues = Array(3,5,6,4,2,6,4,6,2,1,8,7,3,9,9,2,2,6)

' Skapa ett Dictionary med unika värden samt räkna/spara antal förekomster
Set objDict = Server.CreateObject("Scripting.Dictionary")
For Each elem In arrOriginalValues	
If Not objDict.Exists(elem) Then 
 objDict.Add elem, 1
Else
 objDict.Item(elem) = objDict.Item(elem)+1
End If
Next

' Antal värden i dictionary
dictCount = objDict.Count


' Skriv ut värden och antal
Response.Write "<p>Antal värden: "&dictCount&"</p>"
Response.Write "| Värde = Antal |<br>"
dictKeys = objDict.Keys()
For i=0 to dictCount-1
strKey = dictKeys(i)
strVal = objDict.Item(strKey)
Response.Write("|"& strKey & " = " & strVal & "|<br/>")
Next

Set objDict = Nothing
%>

 

 

 

 

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...