2011-09-30 15 views
6

Próbuję opracować algorytm w języku C#, który może pobrać listę adresów URL i wypisać je na liście z numerami konspektów.C# numeracja konspektu

Jak możesz sobie wyobrazić, potrzebuję pomocy. Czy ktoś ma jakieś sugestie co do logiki, która posłuży do wygenerowania tej listy?

Przykład wyjściowa:

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 

... i tak dalej

+0

cześć, czy nie ma usterki w 1.3.2 i 1.3.2.1? Zamiast tego nazwałbym drugi 1.3.3.1 - czy to prawda? – Carsten

+2

Dlaczego ten >> '1.1.5 - http: // www.example.com/aboutus/page13' ?. Dlaczego nie jest to "1.5"? – Nawaz

+1

Czy lista początkowo została posortowana w kolejności, w jakiej ma być numerowana? Dlaczego 'http: // www.example.com/aboutus/aboutus' nie 1.1? –

Odpowiedz

3

Prawdopodobnie będziesz musiał usunąć parametry łańcucha i parametrów zapytania, więc podaj +1, aby radzić sobie z używaniem klasy System.URI.

Jeśli chodzi o drukowanie w formie drzewa - bezpośrednim podejściem jest użycie Dictionary<string, string>, aby zachować powiązanie elementu potomnego (klucz) z rodzicem (wartość).

Innym sposobem jest skorzystanie z List<T>.Sort, np. tak:

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); 
    } 
} 

Niestety p.campbell ma rację, porównanie zwyczaj jest rzeczywiście potrzebne tutaj, co sprawia, że ​​wdrożenie wciąż dość wydajnych, ale bardziej nieporęczne (?:-abuse ostrzeżenie):

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; 
} 

PS: Tak aby złożyć zastrzeżenie, uważam, że logika Stacks jest zbędna, ale nieco bardziej skomplikowana do zrozumienia. W projekcie długoterminowym trzymałbym się ze słownikiem dziecko-rodzic.

+1

Doskonały start! Jedna nitka: sortowanie jest tak aktualne, że [sortuje się "pod" Page1 "] (http://i.imgur.com/5Vnzf.png) –

+0

@ p.campbell Dobra uwaga! Dodałem niestandardowe porównanie sortowania. –

+0

Dzięki DK. Właśnie tego potrzebowałem! – Steve

8

Spójrz na klasę System.URI. Powinien mieć pewne metody i cechy, które powinny być użyteczne, takie jak właściwość segmentów, która splami uri na części podzielone na segmenty (podzielone przez slash w zasadzie). Można utworzyć listę tablic segmentów, posortować listę, a następnie po prostu powtórzyć listę, dostosowując liczby w zależności od tego, czy bieżące segmenty indeksów odpowiadają poprzednim segmentom indeksu listy.

0

Myślę, że musisz zaimplementować jakąś kolekcję drzew do obsługi zamówienia. Ponieważ jeśli dodałeś nowy link o nazwie http://www.example.com, stanie się to 1 zamiast http://www.example.com/aboutus.

Następnie można wydrukować w kolejności w kolejności drzewa i będzie bardzo proste.

Powiązane problemy