2013-02-18 29 views
9

Tôi đã viết một phương thức đệ quy nhận tất cả các kết hợp ký tự có thể có từ các ký tự trong một chuỗi. Tôi cũng có phương pháp truy cập và trả lại danh sách các combo:Phương thức đệ quy hoạt động trong java với giao diện điều khiển, nhưng không phải với android

public static void uns(String word, StringBuilder s, List combos) 
{ 
    for(char c: word.toCharArray()) 
    { 
     s.append(c); 
     if(word.length() != 1) 
      { 
      uns(removeChar(word, c),s,combos); 
      } 
     else 
     { 
      combos.add(s.toString()); 
     } 
     s.deleteCharAt(s.toString().length()-1); 
    } 

} 

public static List getCombinations(String word) 
{ 
    List<String> combinations = new ArrayList<String>(); 
    uns(word,new StringBuilder(),combinations); 
    return combinations; 
} 

public static String removeChar(String s, char c) 
{ 
    int index = s.indexOf(c); 
    return s.substring(0,index)+s.substring(index+1); 
} 

Khi thử nghiệm trong Java, nó không có lỗi. Vì một số lý do, khi tôi sử dụng nó trong Android, danh sách được điền với số lượng phần tử chính xác, nhưng mọi phần tử đều giống nhau. Ví dụ, đối với từ "here", nó trả về một danh sách chứa đầy "eerh".

+0

Định nghĩa của 'removeChar()' là gì? – Eric

+0

@Eric Xin lỗi, đã chỉnh sửa lại. – Wilson

Trả lời

9

Đây là một trục trặc rất lạ (chắc chắn có thể tái sản xuất) và bạn có thể muốn gửi báo cáo lỗi về vấn đề này.

Tuy nhiên, đây là giải pháp tạm thời; thay vì sử dụng .toString(), xuất hiện bằng cách nào đó sử dụng lại tham chiếu (ngay cả khi tôi làm .substring(0) với nó), vì vậy tất cả chúng đều được cập nhật; nếu bạn in ra danh sách sau mỗi lần lặp lại, bạn sẽ thấy ý tôi là gì.

Đây là giải pháp hacky/không hiệu quả của tôi. Thay đổi:

combos.add(s.toString()); 

... để:

combos.add(s + ""); 

này có hiệu quả bắt chước chuỗi đúng vào mảng, do đó họ không thao túng:

02-17 19:33:48.605: I/System.out(6502): [Combos]: [here, heer, hree, hree, here, heer, ehre, eher, erhe, ereh, eehr, eerh, rhee, rhee, rehe, reeh, rehe, reeh, ehre, eher, erhe, ereh, eehr, eerh]

+0

+1 để tự mình thử nghiệm * và * đưa ra giải pháp! –

+1

@ A - C Tôi phải thử; Tôi không thể tin nó mà không nhìn thấy nó bằng chính mắt mình. :) – Eric

+0

@Eric Tuyệt vời, trong câu trả lời chuyên sâu. Cảm ơn. – Wilson

0

Tôi không tích cực nhưng tôi nghĩ rằng phương thức valueOf() từ chuỗi ký tự s cũng sẽ làm việc. có thể thử sử dụng một List thay vì StringBuilder, thêm các ký tự vào danh sách và thử String.valueOf (s.get (i)); và điều đó sẽ chuyển đổi ký tự thành chuỗi. tôi không thấy lý do tại sao không hoạt động trong Android nhưng bạn có thể cần sửa đổi vòng lặp của mình một chút. hy vọng rằng sẽ giúp.

+0

Không, cùng trục trặc với '.valueOf()'. Tôi nghĩ 'String.valueOf (StringBuilder)' chỉ trả về 'StringBuilder.toString()', giống như mã của OP. – Eric

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