Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

supression des doublon dans un arraylist avec cumule des valeur de ce doublon

8 réponses
Avatar
Pas de Spam
bonjour j'ai crée un arraylist dont les éléments sont des
structures (string,val1,val2,val3,val4) pour plus d'info de ma structure
c'est une modif de ce code
http://groups.google.fr/groups?hl=fr&lr=&cr=countryFR&ie=UTF-8&selm=%23K%241fOXoEHA.868%40TK2MSFTNGP10.phx.gbl

j'aimerais pouvoir supprimer les doublons mais en gardant les vals cumuler
au doublon
un exemple:

ligne mon arraylist contient
1er ligne "bonjour",12,5,3,2
2eme 'bonjour",5,3,2,0
ect.....


j'aimerais obtenir une seule ligne du style
"bonjour",17,8,5,2

addition des values puis suppression de la ligne de doublon

j'envisage de faire un struc du style comme le code qui suit avec les
enumerator

mais ne voudrait il pas mieux faire une copy de l'arraylist puis traiter
ligne par ligne avec une boucle
for next
comment revenir en arrière dans la boucle pour modifier la ligne précédente
et insérer les nouvelle value
avant d'effacer le doublon ?? enfin plein de question qui restent sans
réponses

Public sub doublon (myArr As Arraylist)
Dim myEnumerator As System.Collections.IEnumerator = _
myArr.GetEnumerator()

'bounle pour suppression de mes doublon ...while myEnumerator.MoveNext()
Console.Write(ControlChars.Tab + "{0}", myEnumerator.Current)
End Whileend subbon en bref je ne sais comment faire avez vous une
idée ou un bout de code...merci a tousFabrice

8 réponses

Avatar
Pas de Spam
je viens de trouver 'interface ICloneable'

Méthode Margins.Clone
Extrait un doublon de cet objet, membre par membre.

Public Overridable Function Clone() As Object Implements _
ICloneable.Clone

peut être un début de piste
si quelqu'un a des infos la dessus

"Pas de Spam" a écrit dans le message de news:
%
bonjour j'ai crée un arraylist dont les éléments sont des
structures (string,val1,val2,val3,val4) pour plus d'info de ma structure
c'est une modif de ce code



Fabrice
Avatar
Zazar
Bonjour,

bonjour j'ai crée un arraylist dont les éléments sont des
structures (string,val1,val2,val3,val4) pour plus d'info de ma structure
c'est une modif de ce code



http://groups.google.fr/groups?hl=fr&lr=&cr=countryFR&ie=UTF-8&selm=%23K%241fOXoEHA.868%40TK2MSFTNGP10.phx.gbl

j'aimerais pouvoir supprimer les doublons mais en gardant les vals cumuler
au doublon
un exemple:

ligne mon arraylist contient
1er ligne "bonjour",12,5,3,2
2eme 'bonjour",5,3,2,0
ect.....


j'aimerais obtenir une seule ligne du style
"bonjour",17,8,5,2

addition des values puis suppression de la ligne de doublon



AMA, le plus simple c'est de créer un nouvel ArrayList, de parcourir le
premier et pour chaque élément : vérifier si l'élément existe dans le nouvel
arraylist : si non : l'ajouter au nouvel arraylist, si oui : cumulez les
valeurs.
Je vous laisse faire l'implémentation, si vous avez des difficultés, postez
votre code ici.
Ensuite une fois que ce sera fait, on pourrait si nécessaire envisager une
optimisation en utilisant une table de hachage par exemple.

Bon courage,

--
Zazar
Avatar
Pas de Spam
bonjour,

effectivement c'est le principe que j'ai utiliser mais pas le code sous la
main
donc je le poste des que je peux

après avoir fait un trie
je parcoure le arraylist en comparant item n et item n+1
si identique addition des valeurs
si différent création de la ligne n-1 avec les valeur a jour

enfin bref le code parlera de lui même

merci zazar


AMA, le plus simple c'est de créer un nouvel ArrayList, de parcourir le
premier et pour chaque élément : vérifier si l'élément existe dans le
nouvel
arraylist : si non : l'ajouter au nouvel arraylist, si oui : cumulez les
valeurs.
Je vous laisse faire l'implémentation, si vous avez des difficultés,
postez
votre code ici.
Ensuite une fois que ce sera fait, on pourrait si nécessaire envisager une
optimisation en utilisant une table de hachage par exemple.

Bon courage,

--
Zazar




Avatar
Pas de Spam
ok voila mon code

je vous ai extrait les parties qui nous interresse

la class suivie de la fonction d'une form
la class c'est juste pour archive pour ceux qui veule implementer un tri

Public Class ArrayListItem

Implements IComparable

Private _produit As String
Private _Lundi As Single
Private _Mardi As Single
Private _Mercredi As Single
Private _Jeudi As Single

Public ReadOnly Property produit() As String
Get
Return _produit
End Get
End Property
Public ReadOnly Property Lundi() As Single
Get
Return _Lundi
End Get
End Property

Public ReadOnly Property Mardi() As Single
Get
Return _Mardi
End Get
End Property

Public ReadOnly Property Mercredi() As Single
Get
Return _Mercredi
End Get
End Property

Public ReadOnly Property Jeudi() As Single
Get
Return _Jeudi
End Get
End Property



Public Sub New(ByVal s As String, ByVal i As Single, ByVal j As Single,
ByVal k As Single, ByVal l As Single)
_produit = s
_Lundi = i
_Mardi = j
_Mercredi = k
_Jeudi = l
End Sub

Public Function CompareTo(ByVal obj As Object) As Integer _
Implements System.IComparable.CompareTo
If obj.GetType Is GetType(ArrayListItem) Then
Return _produit.CompareTo(DirectCast(obj,
ArrayListItem).produit)
End If
Return 0
End Function


End Class


'la fonction


Dim e, f, g, h As Single


Dim arr As New ArrayList()
Dim arrcopy As New ArrayList()
Dim arrint As ArrayListItem




arr.Add(New ArrayListItem("zzzz",12,5,3,4)
arr.Add(New ArrayListItem("bojour",12,5,3,4)
arr.Add(New ArrayListItem("bojour",12,5,3,4)
arr.Add(New ArrayListItem("aaa",12,5,3,4)
arr.Add(New ArrayListItem("zzzz",12,5,3,4)

arr.Sort()

Dim myEnumerator As System.Collections.IEnumerator = _
arr.GetEnumerator()
myEnumerator.MoveNext() 'serie1
arrint = myEnumerator.Current '

e = arrint.Lundi 'pour permettre une memorisation de la premiere
ligne
f = arrint.Mardi '
g = arrint.Mercredi '
h = arrint.Jeudi '
old = arrint.produit '

While myEnumerator.MoveNext()
arrint = myEnumerator.Current

If arrint.produit <> old Then
arrcopy.Add(New ArrayListItem(old, e, f, g, h))
e = 0
f = 0
g = 0
h = 0
End If

e = e + arrint.Lundi
f = f + arrint.Mardi
g = g + arrint.Mercredi
h = h + arrint.Jeudi
old = arrint.produit


End While

arrcopy.Add(New ArrayListItem(old, e, f, g, h)) 'ligne 2 pour
ecrire la dernier ligne du arrcopy

DataGrid1.DataSource = arrcopy



bon et bien voila pas tres jolie comme code mais ca marche!!

si vous avez une solution pour eviter la serie1 et ligne 2

autre chose aussi comment dans mon datagridtabelstyle/gridcolunstyle definir
un mappingname car dans mon array list il n'y a pas de table et mon datagrid
me sort pas les bonne colune

je sais definir la mise en page de mon datagrid avec des BD mais la je ne
sais comment faire avec le arraylist
c'est la premiere ligne qui donne le nom des collones ???

enfin bref ok pour optimisation -> zazar si tu as une idee
Avatar
Zazar
> Public Class ArrayListItem

Implements IComparable


(snip)
Public Sub New(ByVal s As String, ByVal i As Single, ByVal j As


Single,
ByVal k As Single, ByVal l As Single)
_produit = s
_Lundi = i
_Mardi = j
_Mercredi = k
_Jeudi = l
End Sub

Public Function CompareTo(ByVal obj As Object) As Integer _
Implements System.IComparable.CompareTo
If obj.GetType Is GetType(ArrayListItem) Then
Return _produit.CompareTo(DirectCast(obj,
ArrayListItem).produit)



Attention : si produit vaut nothing, vous allez avoir une exception. Si
nothing est une valeur interdite pour produit, faîtes un test dans le
constructeur et levez une ArgumentException si nécessaire.
End If
Return 0


Dans le cas où on essaie de comparer un ArrayListItem à un Poireau, on
s'attend à trouver une erreur pas à découvrir qu'ils sont égaux :).
End Function

End Class





'la fonction


Dim e, f, g, h As Single


Utilisez des noms de variables explicites!


Dim arr As New ArrayList()
Dim arrcopy As New ArrayList()
Dim arrint As ArrayListItem




arr.Add(New ArrayListItem("zzzz",12,5,3,4)
arr.Add(New ArrayListItem("bojour",12,5,3,4)
arr.Add(New ArrayListItem("bojour",12,5,3,4)
arr.Add(New ArrayListItem("aaa",12,5,3,4)
arr.Add(New ArrayListItem("zzzz",12,5,3,4)

arr.Sort()

Dim myEnumerator As System.Collections.IEnumerator = _
arr.GetEnumerator()
myEnumerator.MoveNext() 'serie1


Testez quand même le résultat, si votre fonction doit travailler sur un
ArrayList, elle ne doit pas planter
arrint = myEnumerator.Current '


Si la ligne ci-dessus compile, c'est que vous n'utilisez pas option strict :
c'est une trés mauvaise habitude.

e = arrint.Lundi 'pour permettre une memorisation de la premiere
ligne
f = arrint.Mardi '
g = arrint.Mercredi '
h = arrint.Jeudi '
old = arrint.produit '

While myEnumerator.MoveNext()
arrint = myEnumerator.Current

If arrint.produit <> old Then
arrcopy.Add(New ArrayListItem(old, e, f, g, h))
e = 0
f = 0
g = 0
h = 0
End If

e = e + arrint.Lundi
f = f + arrint.Mardi
g = g + arrint.Mercredi
h = h + arrint.Jeudi
old = arrint.produit


cette dernière ligne pourrait être mise dans un Else du bloc if précédent.


End While

arrcopy.Add(New ArrayListItem(old, e, f, g, h)) 'ligne 2 pour
ecrire la dernier ligne du arrcopy

DataGrid1.DataSource = arrcopy



bon et bien voila pas tres jolie comme code mais ca marche!!

si vous avez une solution pour eviter la serie1 et ligne 2



C'est améliorable mais pas si moche que ça :
-> au lieu de travailler sur un old, e, f, g et h, travaillez avec un
oldArrayListItem (au passage le nom de la classe ne me semble pas avoir été
choisi judicieusement) initialisé à nothing
-> ne faîtes pas de cas particulier au début, dans votre boucle il suffit de
tester si oldArrayListItem vaut nothing ou s'il vaut quelque chose
-> n'ajoutez pas le viel élément dans la copie, mais ajoutez le nouveau
->postez la nouvelle version de votre code


autre chose aussi comment dans mon datagridtabelstyle/gridcolunstyle


definir
un mappingname car dans mon array list il n'y a pas de table et mon


datagrid
me sort pas les bonne colune

je sais definir la mise en page de mon datagrid avec des BD mais la je ne
sais comment faire avec le arraylist
c'est la premiere ligne qui donne le nom des collones ???


Vous êtes en ASP.NET ou en Windows Forms ?


enfin bref ok pour optimisation -> zazar si tu as une idee


Ca va dépendre des contraintes : le résultat doit-il être trié ou non ?
Mais en gros l'idée, c'est
-> ne pas faire de tri au début
-> au lieu d'utiliser un arraylist en destination, utiliser une table de
hachage dont la clef est la propriété produit et la valeur l'item
correspondant.

Mais ça n'a d'intérêt (point de vue performances, aprés il reste l'intérêt
pédagogique) que si vous manipulez beaucoup d'éléments.

--
Zazar
Avatar
Pas de Spam
ok merci pour les commentaires ;-)

je sais definir la mise en page de mon datagrid avec des BD mais la je ne
sais comment faire avec le arraylist
c'est la premiere ligne qui donne le nom des collones ???


Vous êtes en ASP.NET ou en Windows Forms ?




je suis web form.


-> au lieu d'utiliser un arraylist en destination, utiliser une table de
hachage dont la clef est la propriété produit et la valeur l'item
correspondant.



ton idée de la table est très bien c'est ce que j'avais fais avant de crée
ma class
et j'ai abandonner a cause du tri mais la comme est le trie est fait au
préalable la table en destination de mon array (avec quelques colonne) me
convient et la ça marcheras impeccable.

merci
Avatar
Zazar
> >> je sais definir la mise en page de mon datagrid avec des BD mais la je


ne
>> sais comment faire avec le arraylist
>> c'est la premiere ligne qui donne le nom des collones ???
> Vous êtes en ASP.NET ou en Windows Forms ?
je suis web form.



Alors il vous suffit de rajouter dans votre DataGrid des colonnes ayant pour
titre le texte que vous voulez et comme DataField le nom d'une des
propriétés de votre classe.

--
Zazar
Avatar
Pas de Spam
> Alors il vous suffit de rajouter dans votre DataGrid des colonnes ayant


pour
titre le texte que vous voulez et comme DataField le nom d'une des
propriétés de votre classe.




et oui c'est presque comme ca que j'ai fait. et ca marche au poil ;-) super
super

j'ai declare un datagridtabelstyle avec des gridcolunstyle.mapagename = nom
des colonnes de ma table
table.column="1er col" ......