2011-09-30 26 views
6

Tôi đang cố gắng phát triển một thuật toán trong C# có thể lấy một danh sách mảng URL và xuất chúng trong một danh sách được đánh số phác thảo.C# phác thảo đánh số

Như bạn có thể hình dung tôi cần trợ giúp. Có ai có bất cứ đề nghị về logic để sử dụng để tạo ra danh sách này?

Kết quả ví dụ:

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 

... và vân vân

+0

hi, không có trục trặc trong 1.3.2 và 1.3.2.1? Tôi muốn gọi thứ hai 1.3.3.1 thay vào đó - đúng không? – Carsten

+2

Tại sao điều này >> '1.1.5 - http: // www.example.com/aboutus/page13' ?. Tại sao không phải là '1.5'? – Nawaz

+1

Danh sách ban đầu có được sắp xếp theo thứ tự bạn muốn nó được đánh số không? Tại sao 'http: // www.example.com/aboutus/aboutus' không phải là 1.1? –

Trả lời

3

Có thể bạn sẽ phải loại bỏ các tham số chuỗi giao thức và truy vấn, vì vậy +1 với lời khuyên sử dụng lớp System.URI để xử lý điều đó.

Để in bằng hình dạng cây - cách tiếp cận trực tiếp là sử dụng Dictionary<string, string> để giữ liên kết (khóa) con với giá trị gốc (giá trị).

Một cách khác là để tận dụng lợi thế của List<T>.Sort, ví dụ như thế này:

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

Thật không may, p.campbell là đúng, một sự so sánh tùy chỉnh được thực sự cần thiết ở đây, mà làm cho thực hiện này vẫn còn khá performant, nhưng cồng kềnh hơn (?:-abuse cảnh báo):

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: Just để đưa ra tuyên bố từ chối trách nhiệm, tôi cảm thấy rằng logic Stacks là hợp lý, nhưng phức tạp hơn một chút để hiểu. Trong một dự án dài hạn, tôi sẽ gắn bó với một từ điển dành cho trẻ em.

+1

Bắt đầu tuyệt vời! Một nit: phân loại là hiện tại sao cho nó [sắp xếp "Page10" thành "Page1"] (http://i.imgur.com/5Vnzf.png) –

+0

@ p.campbell Điểm tốt! Tôi đã thêm so sánh sắp xếp tùy chỉnh. –

+0

Cảm ơn DK. Đây chính xác là những gì tôi cần! – Steve

8

Hãy xem lớp System.URI. Nó cần phải có một số phương pháp và sự thích hợp cần phải có ích, giống như thuộc tính của phân đoạn mà chia nhỏ uri thành các phần được phân đoạn của nó (được chia tách bằng dấu gạch chéo cơ bản). Bạn có thể tạo danh sách các mảng phân đoạn, sắp xếp danh sách, sau đó chỉ cần lặp lại danh sách điều chỉnh các số tùy thuộc vào thời điểm phân đoạn danh sách hiện tại phù hợp với các phân đoạn danh sách trước đó.

0

Tôi nghĩ bạn cần triển khai một số loại bộ sưu tập cây để xử lý đơn hàng. Bởi vì nếu bạn đã thêm liên kết mới có tên là http://www.example.com, liên kết đó sẽ trở thành 1 thay vì http://www.example.com/aboutus.

Sau đó, bạn có thể in giao điểm theo thứ tự của cây và nó sẽ cực kỳ đơn giản.

Các vấn đề liên quan