2011-09-30 17 views
6

Estoy tratando de desarrollar un algoritmo en C# que pueda tomar una lista de matrices de URL y darlas como resultado en una lista numerada.numeración de esquema C#

Como se puede imaginar, necesito ayuda. ¿Alguien tiene alguna sugerencia sobre la lógica a usar para generar esta lista?

Ejemplo de salida:

1 - http://www.example.com/aboutus 
1.2 - http://www.example.com/aboutus/page1 
1.3 - http://www.example.com/aboutus/page2 
1.3.1 - http://www.example.com/aboutus/page2/page3 
1.3.1.1 - http://www.example.com/aboutus/page2/page3/page4 
1.3.2 - http://www.example.com/aboutus/page5/page6 
1.3.2.1 - http://www.example.com/aboutus/page5/page7/page9 
1.3.2.2 - http://www.example.com/aboutus/page5/page8/page10 

1.4 - http://www.example.com/aboutus/page10 
1.4.1 - http://www.example.com/aboutus/page10/page11 
1.4.2 - http://www.example.com/aboutus/page10/page12 

1.1.5 - http://www.example.com/aboutus/page13 

1.1.6 - http://www.example.com/aboutus/page14 
1.1.6.1 - http://www.example.com/aboutus/page14/page15 
1.1.6.2 - http://www.example.com/aboutus/page14/page16 
1.1.6.3 - http://www.example.com/aboutus/page14/page17 

... y así sucesivamente

+0

hola, ¿no hay un error en 1.3.2 y 1.3.2.1? Llamaría al segundo 1.3.3.1 en su lugar, ¿es así? – Carsten

+2

¿Por qué este >> '1.1.5 - http: // www.example.com/aboutus/page13' ?. ¿Por qué no es '1.5'? – Nawaz

+1

¿La lista está inicialmente ordenada en el orden en que desea numerarla? ¿Por qué 'http: // www.example.com/aboutus/aboutus' no es 1.1? –

Respuesta

3

Probablemente tenga que quitar el protocolo y los parámetros de cadena de consulta, por lo que +1 a la recomendación de utilizar la clase System.URI para manejar eso.

En cuanto a la impresión en forma de árbol - un acercamiento directo es usar un Dictionary<string, string> para mantener la asociación de hijo (clave) a un padre (valor).

Otra forma es aprovechar List<T>.Sort, p. Ej. de esta manera:

public static void Print(List<string> list) 
{ 
    var path = new Stack<string>(); 
    var count = new Stack<int>(); 
    path.Push(""); 
    count.Push(0); 

    list.Sort(new Comparison<string>(UrlComparison)); 

    foreach (var x in list) 
    { 
     while (!x.StartsWith(path.Peek())) { path.Pop(); count.Pop(); } 
     count.Push(count.Pop() + 1); 
     foreach(var n in count.Reverse()) Console.Write("{0}.", n); 
     Console.WriteLine(" {0}", x); 
     path.Push(x); 
     count.Push(0); 
    } 
} 

Desafortunadamente, p.campbell es correcto, una comparación personalizada que realmente se requiere aquí, lo cual hace que esta aplicación todavía muy performante, pero más voluminosos (?:-abuse aviso):

public static int UrlComparison(string x, string y) 
{ 
    if (x == null && y == null) return 0; 
    if (x == null) return -1; 
    if (y == null) return 1; 
    for(int n = 0; n < Math.Min(x.Length, y.Length); n++) 
    { 
     char cx = x[n], cy = y[n]; 
     if(cx == cy) continue; 
     return 
      (cx == '/' || cx == '.' || cx == '?') ? -1 : 
      (cy == '/' || cy == '.' || cy == '?') ? 1 : 
      (cx > cy) ? 1 : -1; 
    } 
    return (x.Length == y.Length) ? 0 : (x.Length > y.Length) ? 1 : -1; 
} 

PD: Justo para poner un descargo de responsabilidad, siento que la lógica de Stacks es consize, pero un poco más compleja de entender. En un proyecto a largo plazo, me quedaría con un diccionario de padres y niños.

+1

¡Excelente comienzo! Una nit: la clasificación es actual de modo que [clasifica "Página 10" justo debajo de "Página1"] (http://i.imgur.com/5Vnzf.png) –

+0

@ p.campbell ¡Buen punto! He agregado una comparación de clasificación personalizada. –

+0

Gracias DK. Esto es exactamente lo que necesitaba! – Steve

8

Eche un vistazo a la clase System.URI. Debería tener algunos métodos y propiedades que deberían ser útiles, como la propiedad de segmentos que divide el uri en sus partes segmentadas (dividido por barras básicamente). Puede crear una lista de las matrices de segmentos, ordenar la lista, y luego simplemente iterar la lista ajustando los números dependiendo de si los segmentos del índice de la lista actual coinciden con los segmentos del índice de la lista anterior.

0

Creo que necesita implementar algún tipo de colección de árbol para manejar el pedido. Porque si agregó un nuevo enlace llamado http://www.example.com, se convertiría en 1 en lugar de http://www.example.com/aboutus.

Luego puede imprimir el recorrido en orden del árbol y será extremadamente simple.

Cuestiones relacionadas