La Pause Café du Forum Programmation [PART 2]

Dites j’ai un mega trou pour un algo :
J’ai une liste d’objets X et je dois effectuer une action entre chacun d’entre eux.
Liste :

  • a
  • b
  • c
  • d

Et comme action(x, y) <=> action(y, x) et que action(z, z) est inutile

Je dois faire :

  • action(a, b)
  • action(a, c)
  • action(a, d)
  • action(b, c)
  • action(b, d)
  • action(c, d)

Il me semble qu’il existe un algo pour ça mais pas moyen de remettre la main dessus.
(Je voudrais si possible éviter le

pour chaque `x` de `liste` faire :
	pour chaque `y` de `liste` faire :
		si `x` =/= `y` alors :
			action(x, y)
		finsi
	finpour
finpour

(Surtout que çe ne gère même pas le fait que action(x, y) <=> action(y, x))
Edité le 22/03/2008 à 17:08

Si tu as un index numérique sur ta liste, tu peux faire quelque chose comme :


pour i allant de 0 à taille(liste) - 1
	pour y allant de i + 1 à taille(liste)
		action(liste[i],[liste[y])

Ce qui du coup gère la condition action(x, y) <=> action(y, x).
Edité le 22/03/2008 à 17:31

Pourquoi des trous ? Action supprime des éléments de la liste ?


```
        List<string> test = new List<string>();

        test.Add("1");
        test.Add("2");
        test.Add("3");

        test.RemoveAt(1);

        Console.WriteLine(test[0]);
        Console.WriteLine(test[1]);


Résultat : 
[quote=""]

1
3
[/quote]
<hr />Petit encart inutile :


public class test
{
public string name;
public int number;

}

private void button1_Click(object sender, EventArgs e)
{
List liste = new List();

liste.Add(new test { name = "Premier", number = 1 });
liste.Add(new test { name = "Second", number = 2 });
liste.Add(new test { name = "Troisième", number = 3 });
liste.Add(new test { name = "Quatrième", number = 4 });
liste.Add(new test { name = "Cinquième", number = 5 });
liste.Add(new test { name = "Sixième", number = 6 });

var result = 	from l in liste
		where (l.number % 2 == 0)
		select l;

foreach (var val in result)
	Console.WriteLine(val.name);

}



Résultat : 

[quote=""]

Second
Quatrième
Sixième
[/quote]

J'adore C# 3 :love:
Edité le 22/03/2008 à 18:02

Effectivement c’est plus ou moins le cas (selon certains autres paramètres). Ce qui m’a d’ailleurs forcé à temporiser ces suppressions (modifier une liste pendant qu’on itère dessus c’est pas super).
Mais une suppression peut également survenir dans d’autres cas.

En tout cas merci ça va simplifier mon code :slight_smile:

(Pour info, il s’agit d’un petit système de détection de collisions dans un jeu)

Bah voilà : c’est implémenté et ça marche très bien (c’était surtout le problème de l’équivalence action(a, b) <=> action(b, a) qui me « gênait » le plus :

for(int item1_idx = 0; item1_idx < (list.Count - 1); ++item1_idx) { // Itération sur les n-2 premièrs items
	MyObject item1 = list[item1_idx];
	for (int item2_idx = item1_idx + 1; item2_idx < list.Count; ++item2_idx) { // Itération sur les items situées après `item1`
		MyObject item2 = list[item2_idx];
		
		action(item1, item2);
	}
}

Ce que tu fais avec ton trou ne nous regarde pas :o

Bottom pour la peine !

après le bottaumn vient l’hytop! :o

Tentative de lastage…

Tentative de contre-lastage :sommeil2:

Ninja contre-lastage :o

Plop

huhu [:kramoc]

Ba quoi?


Au passage vous êtes mal barrés pour me contrer, car ce soir c'est nuit blanche LAN UT III :D

Vu que DarKChAm a indiquer se retirer de la course c’est entre toi et moi KisSCoOl :slight_smile:

(Ah bah oui : une LAN et c’est BAN 24h du Dernz-Game :o )


Dernz [:kramoc]

Dernzer à 2h30, pfff, ridicule!

C’est sur du UT combien que tu te fais laminer ?
[:kramoc]

Ya du monde ce soir [:kramoc]

Oui je trouve également [:kramoc] [:kramoc]

En tout cas y’a personne ce matin ^^


(Ce post équivaut à un preum's :o )