[Resolu]doublons ou lignes identiques listicon

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
micam
Messages : 46
Inscription : ven. 27/avr./2012 15:29

[Resolu]doublons ou lignes identiques listicon

Message par micam »

Bonjour,
Dans le code suivant, j'aimerai afficher toutes les lignes identiques.
(Tous les nombres, sauf le "quatre" et le "six" qui sont uniques)

Code : Tout sélectionner

;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #ListIcon_1
  #Button_1
  #ListIcon_2
EndEnumeration
;}
;}
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 451, 230, 536, 400, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    ListIconGadget(#ListIcon_1, 25, 20, 220, 225, "Listicon 1", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    SendMessage_(GadgetID(#ListIcon_1), #LVM_SETCOLUMNWIDTH, 0, #LVSCW_AUTOSIZE_USEHEADER)
    ButtonGadget(#Button_1, 265, 255, 210, 25, "afficher les lignes identiques")
    ListIconGadget(#ListIcon_2, 255, 20, 230, 225, "Listicon 2", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    SendMessage_(GadgetID(#ListIcon_2), #LVM_SETCOLUMNWIDTH, 0, #LVSCW_AUTOSIZE_USEHEADER)
    AddGadgetItem(#ListIcon_1,0, "un")
    AddGadgetItem(#ListIcon_1,0, "un")
    AddGadgetItem(#ListIcon_1,0, "deux")
    AddGadgetItem(#ListIcon_1,0, "deux")
    AddGadgetItem(#ListIcon_1,0, "quatre")
    AddGadgetItem(#ListIcon_1,0, "trois")
    AddGadgetItem(#ListIcon_1,0, "un")
    AddGadgetItem(#ListIcon_1,0, "trois")
    AddGadgetItem(#ListIcon_1,0, "six")
  EndIf
EndProcedure

OpenWindow_Window_0()

;{- Event loop
Repeat
  Select WaitWindowEvent()
      ; ///////////////////
    Case #PB_Event_Gadget
      Select EventGadget()
          
        Case #Button_1
          ClearGadgetItems(#ListIcon_2)
          
          For i = 0 To CountGadgetItems(#ListIcon_1)
            Nombre$  = GetGadgetItemText(#ListIcon_1,i,0)
            If FindString(GetGadgetItemText(#ListIcon_1,i-1,0), Nombre$)
              AddGadgetItem(#ListIcon_2, -1, Nombre$)
            EndIf  
          Next
          
          ;           For i = 0 To CountGadgetItems(#ListIcon_1)-1
          ;             Debug CountGadgetItems(#ListIcon_1)
          ;             If GetGadgetItemText(#ListIcon_1,i,0) = GetGadgetItemText(#ListIcon_1,i-1,0)
          ;               AddGadgetItem(#ListIcon_2, 0, GetGadgetItemText(#ListIcon_1,i,0))
          ;             EndIf 
          ;           Next 
          
          
      EndSelect
      ; ////////////////////////
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #Window_0
          CloseWindow(#Window_0)
          Break
      EndSelect
  EndSelect
ForEver
;
;}
J'aimerai que cela affiche :
un
un
deux
deux
trois
un
trois

Merci de votre aide.
Dernière modification par micam le sam. 08/sept./2012 23:38, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: doublons ou lignes identiques listicon

Message par Ar-S »

Je te conseillerai de t'orienter coté liste chainée et tableau.
Il sera bien plus facile de traiter le contenu d'une liste.

Dans l'aide : LinkedList Index
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: doublons ou lignes identiques listicon

Message par Backup »

trop facile :)

c'est un classique ton probleme :)

il suffit de reflechir un peu

comment fais tu toi pour verifier si plusieurs cartes sont pareil dans un jeux de carte ?

ben tu prends la premiere carte tu la garde dans tes mains en reference (donc en fait tu commence une premiere boucle :) )

tu la compare avec la 2em carte du jeux ... puis la 3em , la 4em ...etc (donc tu effectue une 2em boucle :) )... et si tu trouve la meme tu l'ecrit dans ta deuxieme liste :) (ou tu peux aussi la retirer du jeux )

une fois que tu arrive a la fin de ta deuxieme boucle , ( la fin du paquet )

tu recommence la premiere boucle en prenant la 2em carte du jeux , et rebelote (c'est le cas de le dire :lol: )

voici ton code :)



toute l'astuce est là :
For i = 0 To CountGadgetItems(#ListIcon_1)
For b = i+1
au debut je compare la carte
0 avec la 1 puis la
0 avec la 2 puis la
0 avec la 3 ......

plust tart apres la fin de la 2eme boucle
je compare la
1 avec la 2 puis la
1 avec la 3 ... ect ...

toute les cartes auront ete comparé au moins une fois :)


le meme code mais qui suprime en meme temps les Doublon de la liste 1

Code : Tout sélectionner

;{- Enumerations / DataSections
;{ Windows
Enumeration
	#Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
	#ListIcon_1
	#Button_affiche
	#ListIcon_2
EndEnumeration
;}
;}
Procedure OpenWindow_Window_0()
	If OpenWindow(#Window_0, 451, 230, 536, 400, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
		ListIconGadget(#ListIcon_1, 25, 20, 220, 225, "Listicon 1", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
		SendMessage_(GadgetID(#ListIcon_1), #LVM_SETCOLUMNWIDTH, 0, #LVSCW_AUTOSIZE_USEHEADER)
		ButtonGadget(#Button_affiche, 265, 255, 210, 25, "afficher les lignes identiques")
		ListIconGadget(#ListIcon_2, 255, 20, 230, 225, "Listicon 2", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
		SendMessage_(GadgetID(#ListIcon_2), #LVM_SETCOLUMNWIDTH, 0, #LVSCW_AUTOSIZE_USEHEADER)
		AddGadgetItem(#ListIcon_1,0, "un")
		AddGadgetItem(#ListIcon_1,0, "un")
		AddGadgetItem(#ListIcon_1,0, "deux")
		AddGadgetItem(#ListIcon_1,0, "deux")
		AddGadgetItem(#ListIcon_1,0, "quatre")
		AddGadgetItem(#ListIcon_1,0, "trois")
		AddGadgetItem(#ListIcon_1,0, "un")
		AddGadgetItem(#ListIcon_1,0, "trois")
		AddGadgetItem(#ListIcon_1,0, "six")
	EndIf
EndProcedure

OpenWindow_Window_0()

;{- Event loop
Repeat
	Select WaitWindowEvent()
		; ///////////////////
		Case #PB_Event_Gadget
		Select EventGadget()
			
			Case #Button_affiche
			ClearGadgetItems(#ListIcon_2)
			
			for x=0 to 2
				For i = 0 To CountGadgetItems(#ListIcon_1)
					Nombre_referent$  = GetGadgetItemText(#ListIcon_1,i,0)
					For b = i+1 To CountGadgetItems(#ListIcon_1)
						Nombre_copie$  = GetGadgetItemText(#ListIcon_1,b,0)
						If Nombre_copie$=Nombre_referent$
							AddGadgetItem(#ListIcon_2, -1, Nombre_copie$)
							RemoveGadgetItem(#ListIcon_1, b)
						EndIf 
					Next b
				next i
			next x
			
		EndSelect
		; ////////////////////////
		Case #PB_Event_CloseWindow
		Select EventWindow()
			Case #Window_0
			CloseWindow(#Window_0)
			Break
		EndSelect
	EndSelect
ForEver
;
;}; EPB

ps : j'ai ajouté une boucle X parce que tu peux avoir plus d'un Doublon ... des triplés ... (tu as 3 fois "un" dans ta liste )
faudra augmenté cette boucle en fonction du nombre maximum de doublon que tu peux trouver ( ici c'est pour un Max de 3 ;) )
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: doublons ou lignes identiques listicon

Message par G-Rom »

avec une map :

Code : Tout sélectionner


Enumeration
  #Window_0
EndEnumeration

Enumeration
  #ListIcon_1
  #Button_1
  #ListIcon_2
EndEnumeration

Global NewMap m_Word.i()



Procedure add_word(word.s)
  
  If FindMapElement(m_Word(), word)
      m_Word(word) + 1
    Else
      m_Word(word) = 1
  EndIf 
  
  AddGadgetItem(#ListIcon_1,-1,word)
    
EndProcedure


Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 451, 230, 536, 400, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    ListIconGadget(#ListIcon_1, 25, 20, 220, 225, "Listicon 1", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    SendMessage_(GadgetID(#ListIcon_1), #LVM_SETCOLUMNWIDTH, 0, #LVSCW_AUTOSIZE_USEHEADER)
    ButtonGadget(#Button_1, 265, 255, 210, 25, "afficher les lignes identiques")
    ListIconGadget(#ListIcon_2, 255, 20, 230, 225, "Listicon 2", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    SendMessage_(GadgetID(#ListIcon_2), #LVM_SETCOLUMNWIDTH, 0, #LVSCW_AUTOSIZE_USEHEADER)
    add_word("un")
    add_word("un")
    add_word("deux")
    add_word("deux")
    add_word("quatre")
    add_word("trois")
    add_word("un")
    add_word("trois")
    add_word("six")
  EndIf
EndProcedure


OpenWindow_Window_0()

;{- Event loop
Repeat
  Select WaitWindowEvent()
      ; ///////////////////
    Case #PB_Event_Gadget
      Select EventGadget()
          
        Case #Button_1
          ClearGadgetItems(#ListIcon_2)
          
          
          ForEach m_Word()
            
            If m_Word() > 1
              word$ = MapKey(m_Word())
              AddGadgetItem(#ListIcon_2,-1,word$)
            EndIf 
            
          Next
          
          
      EndSelect
      ; ////////////////////////
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #Window_0
          CloseWindow(#Window_0)
          Break
      EndSelect
  EndSelect
ForEver
micam
Messages : 46
Inscription : ven. 27/avr./2012 15:29

Re: doublons ou lignes identiques listicon

Message par micam »

Bonjour et merci de vous intéresser à mon problème.

Je me suis peut être mal expliqué.

J'arrive avec une list à récupérer les doublons, mais il me manque toujours le premier élément des doublons.
exemple :
"un"
"un"
"un"
j'arrive à récupérer 2 "un" (les doublons) mais pas le premier.

La capture jointe expliquera peut-être mieux ce que j'aimerai faire.

Image

Merci encore.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: doublons ou lignes identiques listicon

Message par G-Rom »

En comptant le nombre d'occurence sur la 1° liste ?
toujours avec les map :

Code : Tout sélectionner

Enumeration
  #Window_0
EndEnumeration

Enumeration
  #ListIcon_1
  #Button_1
  #ListIcon_2
EndEnumeration





Global NewMap m_Word.i()

Procedure add_word(word.s)
  
  If FindMapElement(m_Word(), word)
      m_Word(word) + 1 ; c'est un doublon
    Else
      m_Word(word) = 1 ; ce n'est pas un doublon
  EndIf 
  
  AddGadgetItem(#ListIcon_1,-1,word)
    
EndProcedure

Procedure.i word_occurence(word.s)
  If FindMapElement(m_Word(), word)
    ProcedureReturn m_Word(word)
  EndIf 
  ProcedureReturn 0
EndProcedure

Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 451, 230, 536, 400, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    ListIconGadget(#ListIcon_1, 25, 20, 220, 225, "Listicon 1", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    SendMessage_(GadgetID(#ListIcon_1), #LVM_SETCOLUMNWIDTH, 0, #LVSCW_AUTOSIZE_USEHEADER)
    ButtonGadget(#Button_1, 265, 255, 210, 25, "afficher les lignes identiques")
    ListIconGadget(#ListIcon_2, 255, 20, 230, 225, "Listicon 2", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    SendMessage_(GadgetID(#ListIcon_2), #LVM_SETCOLUMNWIDTH, 0, #LVSCW_AUTOSIZE_USEHEADER)
    add_word("six")
    add_word("trois")
    add_word("un")
    add_word("trois")
    add_word("quatre")
    add_word("deux")
    add_word("deux")
    add_word("un")
    add_word("un")
  EndIf
EndProcedure


OpenWindow_Window_0()

;{- Event loop
Repeat
  Select WaitWindowEvent()
      ; ///////////////////
    Case #PB_Event_Gadget
      Select EventGadget()
          
        Case #Button_1
          ClearGadgetItems(#ListIcon_2)
          
          ; On parcours la première liste
          nb = CountGadgetItems(#ListIcon_1)
          
          For i = 0 To nb-1
            word$ = GetGadgetItemText(#ListIcon_1,i)
            If word_occurence(word$) > 1
              AddGadgetItem(#ListIcon_2,-1,word$)
            EndIf 
          Next 
          
          
          
;           ForEach m_Word()
;             
;             If m_Word() > 1
;               word$ = MapKey(m_Word())
;               AddGadgetItem(#ListIcon_2,-1,word$)
;             EndIf 
;             
;           Next
          
          
      EndSelect
      ; ////////////////////////
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #Window_0
          CloseWindow(#Window_0)
          Break
      EndSelect
  EndSelect
ForEver
micam
Messages : 46
Inscription : ven. 27/avr./2012 15:29

doublons ou lignes identiques listicon

Message par micam »

Merci de ton aide G-Rom, ça marche très bien.
Répondre