2011-10-04 39 views
7

Thuật toán này được đặt để chạy trên từ đầu tiên hoặc cho đến khi điền vào bốn chuỗi được mã hóa. Ví dụ, kết quả của đầu vào "Horrible Great" là: H612. Nó bỏ qua từ thứ hai, hay nói cách khác nó chỉ lấy chữ cái đầu tiên từ từ thứ hai để điền vào chuỗi được mã hóa.Một số thay đổi trên Thuật toán Soundex

Tôi muốn thay đổi nó bằng cách lấy từ đầu tiên và tìm chuỗi được mã hóa của nó và THEN lấy từ thứ hai và tìm chuỗi được mã hóa của nó; đầu ra phải là "H614 G600". Vui lòng tôi muốn biết nếu có cách nào để làm điều đó bằng cách thực hiện một số thay đổi thành ** mã này.
Cảm ơn bạn rất nhiều :)

private string Soundex(string data) 
    { 
     StringBuilder result = new StringBuilder(); 
     if (data != null && data.Length > 0) 
     { 
      string previousCode = "", currentCode = "", currentLetter = ""; 
      result.Append(data.Substring(0, 1)); 
      for (int i = 1; i < data.Length; i++) 
      { 
       currentLetter = data.Substring(i,1).ToLower(); 
       currentCode = ""; 

       if ("bfpv".IndexOf(currentLetter) > -1) 
        currentCode = "1"; 
       else if ("cgjkqsxz".IndexOf(currentLetter) > -1) 
        currentCode = "2"; 
       else if ("dt".IndexOf(currentLetter) > -1) 
        currentCode = "3"; 
       else if (currentLetter == "l") 
        currentCode = "4"; 
       else if ("mn".IndexOf(currentLetter) > -1) 
        currentCode = "5"; 
       else if (currentLetter == "r") 
        currentCode = "6"; 

       if (currentCode != previousCode) 
        result.Append(currentCode); 

       if (result.Length == 4) break; 

       if (currentCode != "") 
        previousCode = currentCode; 
      } 
     } 

     if (result.Length < 4) 
      result.Append(new String('0', 4 - result.Length)); 

     return result.ToString().ToUpper(); 
    } 

Trả lời

4

Chắc chắn, đây là giải pháp mà tôi đã đưa ra. Tôi đã bọc thuật toán hiện tại bằng một phương thức khác tách các chuỗi và gọi phương thức gốc. Để sử dụng điều này, bạn sẽ gọi SoundexByWord ("Horrible Great") thay vì gọi Soundex ("Horrible Great") và nhận được đầu ra của "H614 G630".

private string SoundexByWord(string data) 
{ 
    var soundexes = new List<string>(); 
    foreach(var str in data.Split(' ')){ 
     soundexes.Add(Soundex(str)); 
    } 
#if Net35OrLower 
    // string.Join in .Net 3.5 and before require the second parameter to be an array. 
    return string.Join(" ", soundexes.ToArray()); 
#endif 
    // string.Join in .Net 4 has an overload that takes IEnumerable<string> 
    return string.Join(" ", soundexes); 
} 
+0

BẠN ĐANG TUYỆT VỜI! Cảm ơn bạn rất nhiều vì đã chia sẻ. cho phép tôi để chỉnh sửa mã bạn đã viết ở trên: private string SoundexByWord (dữ liệu string) {var soundexes = new List (); foreach (var str in data.Split ('')) { soundexes.Add (Soundex (str)); } chuỗi trả về.Join ("", soundexes.ToArray()); // Chuyển đổi } // danh sách thành một mảng coz tham gia Fun. lấy chuỗi mảng [] :) – user979014

+0

Đó là một điểm tốt. Câu trả lời ban đầu được dựa trên .Net 4. Dựa trên đề xuất của bạn, tôi đã mở rộng câu trả lời để bao gồm các phiên bản trước đó. – jhamm

+0

Tôi ngưỡng mộ chỉnh sửa cuối cùng của bạn và cách giải thích :) cảm ơn một lần nữa – user979014

0

có - đầu tiên phân tích chuỗi thành một mảng các từ (sau khi bạn chọn một tách)

sau đó làm điều này trên mỗi từ

sau đó lắp ráp kết quả trong một số cách chấp nhận được và trả lại.

+0

tôi nghĩ đến một chuỗi Chia sau đó một chuỗi concat để tách và lắp ráp chúng, nhưng tôi muốn thay đổi các thuật toán riêng của mình bằng cách nào đó . tôi đánh giá cao anser của bạn mặc dù :)) – user979014

0

Việc triển khai trong câu hỏi là chính xác nhưng tạo ra rác thừa với các hoạt động chuỗi. Đây là triển khai dựa trên mảng Char nhanh hơn và tạo ra rất ít rác. Nó được thiết kế như một phương pháp mở rộng, và nó xử lý cụm từ (từ tách bằng dấu cách) cũng như:

public static String Soundex(this String input) 
    { 
     var words = input.Split(' '); 
     var result = new String[ words.Length ]; 
     for(var i = 0; i < words.Length; i++) 
      result[ i ] = words[ i ].SoundexWord(); 

     return String.Join(",", result); 
    } 

    private static String SoundexWord(this String input) 
    { 
     var result = new Char[ 4 ] { '0', '0', '0', '0' }; 
     var inputArray = input.ToUpper().ToCharArray(); 

     if(inputArray.Length > 0) 
     { 
      var previousCode = ' '; 
      var resultIndex = 0; 

      result[ resultIndex ] = inputArray[ 0 ]; 

      for(var i = 1; i < inputArray.Length; i++) 
      { 
       var currentLetter = inputArray[ i ]; 
       var currentCode = ' '; 

       if("BFPV".IndexOf(currentLetter) > -1) 
        currentCode = '1'; 
       else if("CGJKQSXZ".IndexOf(currentLetter) > -1) 
        currentCode = '2'; 
       else if("DT".IndexOf(currentLetter) > -1) 
        currentCode = '3'; 
       else if(currentLetter == 'L') 
        currentCode = '4'; 
       else if("MN".IndexOf(currentLetter) > -1) 
        currentCode = '5'; 
       else if(currentLetter == 'R') 
        currentCode = '6'; 

       if(currentCode != ' ' && currentCode != previousCode) 
        result[ ++resultIndex ] = currentCode; 

       if(resultIndex == 3) break; 

       if(currentCode != ' ') 
        previousCode = currentCode; 
      } 
     } 

     return new String(result); 
    } 
Các vấn đề liên quan