2012-04-26 40 views
11

Tôi đang tìm kiếm một thuật toán đơn giản và nhẹ để so sánh hai chuỗi đơn giản.Thuật toán khác biệt của từ đơn giản

Ví dụ, nếu chúng ta lấy hai chuỗi:

  • "The quick brown fox jumps over the lazy dog"
  • "The fox nâu bộ làm êm * tumps so với con chó điên"

Nó sẽ báo hiệu cho tôi rằng 2 chữ cái đầu tiên của từ thứ hai là khác nhau, v.v.

Bây giờ tôi có một thuật toán rất đơn giản so sánh các từ:

/// <summary> 
    /// Make a diff between two strings and returns words indices 
    /// </summary> 
    /// <param name="a"></param> 
    /// <param name="b"></param> 
    /// <returns></returns> 
    public static List<int> Diff(string a, string b) 
    { 
     List<int> indices = new List<int>(); 

     string[] asplit = a.Split(' '); 
     string[] bsplit = b.Split(' '); 

     for (int i = 0; i < asplit.Length; i++) 
     { 
      if (bsplit.Length > i) 
      { 
       if (asplit[i].CompareTo(bsplit[i]) != 0) 
       { 
        indices.Add(i); 
       } 
      } 
     } 

     return indices; 
    } 

Vì vậy, điều này sẽ cho tôi biết từ nào (sử dụng phân tách trên các ký tự khoảng trắng) khác nhau.

Tôi đã đọc nhiều chủ đề ở đây về việc triển khai thuật toán phức tạp hoặc sử dụng thư viện hiện có.

Nhưng tôi được đào tạo lại bởi .NET compact framework (WP7) và tôi không wan't cái gì đó có thể so sánh hai tập tin hoặc hai văn bản, tôi chỉ cần một so sánh từ.

Có thư viện hoặc thuật toán nào có thể phù hợp không? Cảm ơn :).

+1

điều gì sẽ xảy ra nếu một từ được chèn vào giữa một trong các câu sao cho nó bị lệch? Nó có nên báo cáo mọi từ tiếp theo khác nhau không? –

+9

Cách tiêu chuẩn để giải quyết vấn đề này là triển khai thuật toán Hậu quả dài nhất. Nó là một thuật toán khá đơn giản. Tôi có một thực hiện JScript ở đây: http://blogs.msdn.com/b/ericlippert/archive/2004/07/21/189974.aspx chuyển nó sang C# còn lại như một bài tập. –

+0

@ James Michael Hare: hãy nói rằng tôi có "con ngựa nhỏ của tôi" và "con ngựa nhỏ ngọt ngào của tôi", nó chỉ nên báo cáo "ngọt". Tôi nghĩ rằng thuật toán quá đơn giản của tôi thất bại cho việc này. – Valryon

Trả lời

3

Bạn có thể xem dự án DiffPlex.

Chức năng chính trông giống như trong \ DiffPlex \ Differ.cs Nó thậm chí còn có trình xem Silverlight nhưng có thể yêu cầu một số cổng.

Edit:

tôi muốn thêm rằng DiffPlex đặc biệt hỗ trợ so sánh chữ theo câu hỏi của bạn. Nó có thể đã không được rõ ràng bị chôn vùi trong tất cả các nhân vật khác, dòng, vv phương pháp so sánh.

+0

Điều này có vẻ thực sự tốt đẹp, tôi sẽ cố gắng để tích hợp chỉ cốt lõi và xem nếu nó không quá nhiều cho yêu cầu nhỏ của tôi. Cảm ơn! – Valryon

+0

Nó hoạt động thực sự tốt, cảm ơn một lần nữa. Lõi khác thực sự nhẹ và mạnh mẽ, với giao diện dễ hiểu. Sử dụng một ví dụ bổ sung (UnidiffSeqFormater từ http://diffplex.codeplex.com/discussions/254392), tôi đã có thể thực hiện một sự khác biệt phức tạp trong vài dòng. – Valryon

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