OVH Cloud OVH Cloud

au tableau !

13 réponses
Avatar
jc2nantes
Bonjour,

J'ai un tableau par exemple

dim z(0 to 20) as string

chaque valeur différe mais les doublons sont possibles

z(0) = "a"
z(1) = "a"
z(2) = "b"
etc...

comment faire pour compter le nombre de valeurs différentes (le total - les
doublons) ??? 2 dans l'exemple

merci

10 réponses

1 2
Avatar
Aski
Bonjour,

Je ne connais pas de recette toute faite, mais la méthode que j'utiliserais
est la suivante.
Faire un tri en conservant les indices.
Faire une comparaison de 1 au nombre d'éléments et sauter lorsqu'il y a un
doublon.
Compter chaque élément unique.

Si tu le désires, je dois avoir codé une telle logique, mais il te serait
plus formateur d'essayer auparavant ... ;-)

Aski

jc2nantes wrote:
|| Bonjour,
||
|| J'ai un tableau par exemple
||
|| dim z(0 to 20) as string
||
|| chaque valeur différe mais les doublons sont possibles
||
|| z(0) = "a"
|| z(1) = "a"
|| z(2) = "b"
|| etc...
||
|| comment faire pour compter le nombre de valeurs différentes (le
|| total - les doublons) ??? 2 dans l'exemple
||
|| merci
Avatar
Ouattara Inssoukira
Mets toutes les valeurs dans une listebox triée (propriété .sorted = true).
Tu auras ainsi toutes les valeurs dans l'ordre alphabétique dans la
listebox.

Il suffit ensuite de balayer la listebox et de détecter chaque changement de
valeurs pour mettre tes différents compteurs à jour.

Mets aussi la propriété visible de la liste à false pour que toute cette
manipulation ne soit pas visible.

Salut.


"jc2nantes" a écrit dans le message de news:
%
Bonjour,

J'ai un tableau par exemple

dim z(0 to 20) as string

chaque valeur différe mais les doublons sont possibles

z(0) = "a"
z(1) = "a"
z(2) = "b"
etc...

comment faire pour compter le nombre de valeurs différentes (le total -
les
doublons) ??? 2 dans l'exemple

merci




Avatar
ng
Salut,
Mets toutes les valeurs dans une listebox triée (propriété .sorted Ce n'est pas très élégant, il exitse des algo de tri pour vb dispo sur


google.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
Avatar
ng
Salut,
Le plus simple mais pas le plus rapide : utiliser un dictionary :

voici la classe CDictionary :

Option Explicit
Option Compare Text

Private Type tcData
strID As String
vData As Variant
End Type

Private m_tblData() As tcData

Public Sub Add(ID As String, vData As Variant)
Dim tLigne As tcData
tLigne.vData = vData
tLigne.strID = ID
Call AjoutTableauLigne(tLigne, m_tblData)
End Sub

Public Sub Remove(ID As Variant)
Select Case VarType(ID)
Case vbInteger, vbLong
Call SupprimeTableauLigne(CInt(ID) - 1, m_tblData)
Case vbString
Call SupprimeTableauLigne(GetIndexFromID(CStr(ID)), m_tblData)
End Select
End Sub

Public Property Get Count() As Integer
Count = TableauCount(m_tblData)
End Property

Public Property Get Item(ID As Variant) As Variant
Attribute Item.VB_UserMemId = 0
Select Case VarType(ID)
Case vbInteger, vbLong
Item = m_tblData(CInt(ID) - 1).vData
Case vbString
Item = m_tblData(GetIndexFromID(CStr(ID))).vData
End Select
End Property

Public Property Let Item(ID As Variant, ByVal vNewValue As Variant)
Select Case VarType(ID)
Case vbInteger, vbLong
m_tblData(CInt(ID) - 1).vData = vNewValue
Case vbString
m_tblData(GetIndexFromID(CStr(ID))).vData = vNewValue
End Select
End Property


Private Function GetIndexFromID(ID As String) As Integer
If EstTableauValide(m_tblData) Then
Dim i As Integer
For i = 0 To UBound(m_tblData)
If m_tblData(i).strID = ID Then
GetIndexFromID = i
Exit For '//BREAK
End If
Next
End If
End Function

Private Sub Class_Terminate()
Erase m_tblData
End Sub

Private Sub AjoutTableauLigne(tLigne As tcData, tblTableau() As tcData)
If EstTableauValide(tblTableau) Then
Dim nInd As Integer
nInd = UBound(tblTableau) + 1
ReDim Preserve tblTableau(nInd)
tblTableau(nInd) = tLigne
Else
ReDim tblTableau(0)
tblTableau(0) = tLigne
End If
End Sub

Private Function EstTableauValide(tblTableau() As tcData) As Boolean
On Error Resume Next
Err.Clear
Dim lTest As Long
lTest = UBound(tblTableau)
EstTableauValide = (Err.Number = 0)
On Error GoTo 0
End Function

Private Sub SupprimeTableauLigne(Index As Integer, tblTableau() As tcData)
If EstTableauValide(tblTableau) Then
If Index <= UBound(tblTableau) Then
Dim tblTmp() As tcData, i As Integer
For i = 0 To UBound(tblTableau)
If i <> Index Then
Call AjoutTableauLigne(tblTableau(i), tblTmp)
End If
Next
tblTableau = tblTmp
Erase tblTmp
End If
End If
End Sub

Private Function TableauCount(tblTableau() As tcData) As Integer
If EstTableauValide(tblTableau) Then
TableauCount = UBound(tblTableau) + 1
Else
TableauCount = 0
End If
End Function



--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
Avatar
Ouattara Inssoukira
jc2nantes,
Tu as vu la solution élégante que te propose ng. Bon courage.

"jc2nantes" a écrit dans le message de news:
%
Bonjour,

J'ai un tableau par exemple

dim z(0 to 20) as string

chaque valeur différe mais les doublons sont possibles

z(0) = "a"
z(1) = "a"
z(2) = "b"
etc...

comment faire pour compter le nombre de valeurs différentes (le total -
les
doublons) ??? 2 dans l'exemple

merci




Avatar
Hervé
Salut,
Une variante à ng, avec une collection. Teste pour vois si cela correspond à
ce que tu demande et adapte :

Sub Tableau()
Dim Col As Collection
Dim Tbl
Dim I As Long, J As Long
'ici des chaînes
Dim TblDoublon() As String
Dim Doublon As String

'utilise une collection
Set Col = New Collection
'tableau de test
Tbl = Array("a", "b", "c", "d", "a", "c", "d")

On Error Resume Next
For I = 0 To UBound(Tbl)
Col.Add Tbl(I), Tbl(I)
'si déjà existant dans la collection
'récupère le doublon
If Err.Number <> 0 Then
J = J + 1
ReDim Preserve TblDoublon(1 To J)
TblDoublon(J) = Tbl(I)
End If
Next I
'concatène les doublons
For I = 1 To UBound(TblDoublon)
Doublon = Doublon & TblDoublon(I) & vbCrLf
Next I

MsgBox "Il y a " & UBound(TblDoublon) _
& " doublon(s) dont voici la liste :" _
& vbCrLf & Doublon & vbCrLf _
& "Il y a au total " & Col.Count _
& " valeur(s) unique(s)"

Erase Tbl
Set Col = Nothing
Erase TblDoublon
End Sub

Hervé.

"jc2nantes" a écrit dans le message news:
#
Bonjour,

J'ai un tableau par exemple

dim z(0 to 20) as string

chaque valeur différe mais les doublons sont possibles

z(0) = "a"
z(1) = "a"
z(2) = "b"
etc...

comment faire pour compter le nombre de valeurs différentes (le total -


les
doublons) ??? 2 dans l'exemple

merci




Avatar
LE TROLL
Salut,

Si tu aimes le sport, tu as aussi le tri bulle,
principe:

dim trans as string
dim i as long
dim j as long
dim k as long
for k = 0 to 20
for i = 0 to 20
for j = 0 to 20
if i = j then exit for
if z(i) > z(j) then
trans = z(i)
z(i) = z(j)
z(j) = trans
end if
next j
next i
next k
j = 1
compare = z(0)
for i = 1 to 20
if compare <> z(i) then
compare = z(i)
j=j+1
end if
next i
i = 20
k = i - j
msgbox "total général = " & i & vblf & "total sans doublons
= " & j
-------
OBS :
On peut sans doute améliorer, et c'est non testé, je l'ai
fait de tête, il y a peut être quelques coincements et
réglages à faire...
-------

"jc2nantes" a écrit dans le
message de news: %
Bonjour,

J'ai un tableau par exemple

dim z(0 to 20) as string

chaque valeur différe mais les doublons sont possibles

z(0) = "a"
z(1) = "a"
z(2) = "b"
etc...

comment faire pour compter le nombre de valeurs
différentes (le total - les
doublons) ??? 2 dans l'exemple

merci




Avatar
Aski
Bonsoir

Ce code est-il tellement compliqué ?
T() le tableau et nbEl le nombre d'éléments du tableau

Aski

//////////////////////////////////////////////////////////////////
Public Sub SortTable()
Dim i As Integer, j As Integer, Min As Integer
Dim S As String
On Error GoTo Erreur

For i = 0 To nbEl - 3
Min = i
For j = i + 1 To nbEl - 1
If T(j) < T(Min) Then Min = j
Next j
S = T(Min): T(Min) = T(i): T(i) = S
Next i
RemoveTheDoubles
Exit Sub
Erreur:
Msg Error, vbCritical, "SortTable": End
End Sub

Private Sub RemoveTheDoubles(Ind As Byte)
Dim i As Integer, j As Integer
On Error GoTo Erreur

'remplir le tableau en supprimant les doublons
j = -1
Select Case Ind
Case 0
For i = 0 To nbEl - 2
If T(i) <> T(i + 1) Then j = j + 1: T(j) = T(i)
Next i
j = j + 1: T(j) = T(nbEl - 1)
nbEl = j + 1
Exit Sub
Erreur:
MsgBox Error, , "RemoveTheDoubles": End
End Sub
//////////////////////////////////////////////////////////////////////
Aski wrote:
|| Bonjour,
||
|| Je ne connais pas de recette toute faite, mais la méthode que
|| j'utiliserais est la suivante.
|| Faire un tri en conservant les indices.
|| Faire une comparaison de 1 au nombre d'éléments et sauter lorsqu'il
|| y a un doublon.
|| Compter chaque élément unique.
||
|| Si tu le désires, je dois avoir codé une telle logique, mais il te
|| serait plus formateur d'essayer auparavant ... ;-)
||
|| Aski
||
|| jc2nantes wrote:
|||| Bonjour,
||||
|||| J'ai un tableau par exemple
||||
|||| dim z(0 to 20) as string
||||
|||| chaque valeur différe mais les doublons sont possibles
||||
|||| z(0) = "a"
|||| z(1) = "a"
|||| z(2) = "b"
|||| etc...
||||
|||| comment faire pour compter le nombre de valeurs différentes (le
|||| total - les doublons) ??? 2 dans l'exemple
||||
|||| merci
Avatar
LE TROLL
Salut :o) T'as pas encore plus compliqué ???
--------

"ng" a écrit dans le message de news:

Salut,
Le plus simple mais pas le plus rapide : utiliser un
dictionary :

voici la classe CDictionary :

Option Explicit
Option Compare Text

Private Type tcData
strID As String
vData As Variant
End Type

Private m_tblData() As tcData

Public Sub Add(ID As String, vData As Variant)
Dim tLigne As tcData
tLigne.vData = vData
tLigne.strID = ID
Call AjoutTableauLigne(tLigne, m_tblData)
End Sub

Public Sub Remove(ID As Variant)
Select Case VarType(ID)
Case vbInteger, vbLong
Call SupprimeTableauLigne(CInt(ID) - 1,
m_tblData)
Case vbString
Call
SupprimeTableauLigne(GetIndexFromID(CStr(ID)), m_tblData)
End Select
End Sub

Public Property Get Count() As Integer
Count = TableauCount(m_tblData)
End Property

Public Property Get Item(ID As Variant) As Variant
Attribute Item.VB_UserMemId = 0
Select Case VarType(ID)
Case vbInteger, vbLong
Item = m_tblData(CInt(ID) - 1).vData
Case vbString
Item =
m_tblData(GetIndexFromID(CStr(ID))).vData
End Select
End Property

Public Property Let Item(ID As Variant, ByVal vNewValue As
Variant)
Select Case VarType(ID)
Case vbInteger, vbLong
m_tblData(CInt(ID) - 1).vData = vNewValue
Case vbString
m_tblData(GetIndexFromID(CStr(ID))).vData =
vNewValue
End Select
End Property


Private Function GetIndexFromID(ID As String) As Integer
If EstTableauValide(m_tblData) Then
Dim i As Integer
For i = 0 To UBound(m_tblData)
If m_tblData(i).strID = ID Then
GetIndexFromID = i
Exit For '//BREAK
End If
Next
End If
End Function

Private Sub Class_Terminate()
Erase m_tblData
End Sub

Private Sub AjoutTableauLigne(tLigne As tcData,
tblTableau() As tcData)
If EstTableauValide(tblTableau) Then
Dim nInd As Integer
nInd = UBound(tblTableau) + 1
ReDim Preserve tblTableau(nInd)
tblTableau(nInd) = tLigne
Else
ReDim tblTableau(0)
tblTableau(0) = tLigne
End If
End Sub

Private Function EstTableauValide(tblTableau() As tcData)
As Boolean
On Error Resume Next
Err.Clear
Dim lTest As Long
lTest = UBound(tblTableau)
EstTableauValide = (Err.Number = 0)
On Error GoTo 0
End Function

Private Sub SupprimeTableauLigne(Index As Integer,
tblTableau() As tcData)
If EstTableauValide(tblTableau) Then
If Index <= UBound(tblTableau) Then
Dim tblTmp() As tcData, i As Integer
For i = 0 To UBound(tblTableau)
If i <> Index Then
Call AjoutTableauLigne(tblTableau(i),
tblTmp)
End If
Next
tblTableau = tblTmp
Erase tblTmp
End If
End If
End Sub

Private Function TableauCount(tblTableau() As tcData) As
Integer
If EstTableauValide(tblTableau) Then
TableauCount = UBound(tblTableau) + 1
Else
TableauCount = 0
End If
End Function



--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/


Avatar
LE TROLL
Salut,

Cest aussi la méthode que j'emploie, la plus simple avec
les objets...
---------

"Aski" a écrit dans le message de news:

Bonjour,

Je ne connais pas de recette toute faite, mais la méthode
que j'utiliserais
est la suivante.
Faire un tri en conservant les indices.
Faire une comparaison de 1 au nombre d'éléments et sauter
lorsqu'il y a un
doublon.
Compter chaque élément unique.

Si tu le désires, je dois avoir codé une telle logique,
mais il te serait
plus formateur d'essayer auparavant ... ;-)

Aski

jc2nantes wrote:
|| Bonjour,
||
|| J'ai un tableau par exemple
||
|| dim z(0 to 20) as string
||
|| chaque valeur différe mais les doublons sont possibles
||
|| z(0) = "a"
|| z(1) = "a"
|| z(2) = "b"
|| etc...
||
|| comment faire pour compter le nombre de valeurs
différentes (le
|| total - les doublons) ??? 2 dans l'exemple
||
|| merci




1 2