2010-01-26 5 views
1

J'ai un problème en essayant de trier un Dictionary<int,Elem>/SortedList<int,Elem> des éléments.C# élément tri

J'ai une liste des éléments N qui doivent apparaître X fois sur la liste, mais si un élément est sur l'indice i alors il ne peut pas réapparaître sur i - 1 ou i + 1. Je dois aussi respecter les limites de la liste (l'élément N est antérieur à l'élément 1 et l'élément 1 à l'élément N).

J'ai deux points de départ possibles:

  1. Une liste d'éléments qui ont une propriété Times, qui a le nombre de fois où l'élément doit apparaître sur la liste des résultats.

    Exemple d'entrée:

    List<elem> elements = new List<elem>(){new Elem("star", 3), new Elem("square", 2), new Elem("circle", 3)}; 
    //Elem construct take element name, and number of times on result list 
    
  2. Une liste contenant tous les éléments que je veux trier, de toute évidence, de façon unssorted.

    List<elem> elements = new List<elem>(){new Elem("star"),new Elem("star"),new Elem("star"),new Elem("circle"),("circle"),("circle"),new Elem("sqare"),new Elem("sqare")}; 
    

Sortie prévue:

star circle star sqare circle sqare star circle 

// or any other combination in which any element is not preceded by itself 

algorithmes de tri Meilleure performance sont les bienvenus, mais pas un must ici, car cela se fait rarement. J'utilise C# 4.0 et. Net Framework 4.0.

+4

Je ne comprends pas du tout cette question. Peut-être que quelques exemples illustrent ce que vous essayez de faire. Pouvez-vous donner des exemples d'intrants et de résultats attendus pour ces intrants? –

+0

Que se passe-t-il dans le cas où il n'y a pas une telle commande? Par exemple, 'star star star circle' n'a pas cet ordre. – jason

+0

Dans ce cas l'exception devrait être levée par exemple: NoSortingPosibleException ou quelque chose comme ça, mais c'est facile à contrôler en ayant max (elem.times) * 3

Répondre

1

Vous pouvez le faire en utilisant un algorithme de retours en arrière très simple (semblable à la solution standard au eight queens puzzle. Laissez-moi savoir si vous avez besoin de détails.

0

Je n'ai pas le temps de le tester car je n'ai pas accès au studio visuel pour le moment, mais je suis malade.

Premièrement, je recommande de prendre tous les objets et de les trier en trois listes différentes. (cela va par le fait que vous utilisez une liste, modifier comme nessisary,

List<string> circle = new List<string>(); 
List<string> square = new List<string>(); 
List<string> star = new List<string>(); 
foreach(string item in yourList) 
{ 
    switch(item) 
    { 
     case "circle": 
      circle.Add(item); 
      break; 
     case "star": 
      star.Add(item); 
      break; 
     case "square": 
      square.Add(item); 
      break; 
    } 
} 
//then you would move to sorting them into one list, which would be 
List<string> finnished = new List<string>(); 
int count = 0; 
while(count != square.Count -1) 
{ 
    finished.Add(square[count]); 
    finished.Add(star[count]); 
    finished.Add(circle[count]); 
    count++ 
} 
+0

évidemment ce n'est pas une réponse exacte mais j'espère que c'est assez pour vous aider à démarrer! – caesay

+0

oui, je pensais quelque chose comme ça, mais le type d'éléments est inconnu, il pourrait y avoir 3, 5, 10, voire 20 éléments, donc, ce serait un problème avec cette solution. –

0

Mettre en oeuvre une classe clé personnalisée pour SortedList. par exemple

class MyKey : IComparer 
{ 
    int count; 
    int index; // Or maybe something else 
    ... 
} 

ajouter à votre SortedList impliquerait incrémenter la variable de comptage que les valeurs clé personnalisée si elle existe. ou l'ajout d'une nouvelle clé avec cou nt de 1 si ce n'est pas le cas.