2013-07-01 35 views
1
import javax.swing.JOptionPane; 
public class Permutations { 

public static void main(String[] args) throws Exception { 
    String str = null; 
    str = JOptionPane.showInputDialog("Enter a word"); 
    StringBuffer strBuf = new StringBuffer(str); 
    doPerm(strBuf,str.length()); 

} 

private static void doPerm(StringBuffer str, int index){ 
    String[] anArrayOfStrings; 
    if(index == 0){ 
     System.out.println(str); 
     }  
    else { 
     doPerm(str, index-1); 
     int currPos = str.length()-index; 
     for (int i = currPos+1; i < str.length(); i++) { 
      swap(str,currPos, i); 
      doPerm(str, index-1); 
      swap(str,i, currPos); 
     } 
    }  

} 


private static void swap(StringBuffer str, int pos1, int pos2){ 
    char t1 = str.charAt(pos1); 
    str.setCharAt(pos1, str.charAt(pos2)); 
    str.setCharAt(pos2, t1); 
} 

} 

使用上面的代碼我排列一個單詞並在控制檯中打印它們。JOptionPane中的排列

樣品 輸入:壞

輸出:

bad 
bda 
abd 
adb 
dab 
dba 

我想顯示的JOptionPane輸出。我試圖取代這一行

System.out.println(str); 

有了這個

JOptionPane.showMessageDialog(null, str); 

但所有的輸出不1周的JOptionPane加載。相反,它向我展示了一個帶有'bad'的JOptionPane,當我單擊OK或按下Enter時,帶有'bda'的JOptionPane將顯示出來,直到完成循環。我想要的是在單個JOptionPane中顯示6個輸出。

我也嘗試像數組,但幾乎相同的輸出。

private static void doPerm(StringBuffer str, int index){ 
    ArrayList<String> list = new ArrayList<String>(); 
    if(index == 0){ 
     list.add(str.toString()); 
     }  
    else { 
     doPerm(str, index-1); 
     int currPos = str.length()-index; 
     for (int i = currPos+1; i < str.length(); i++) { 
      swap(str,currPos, i); 
      doPerm(str, index-1); 
      swap(str,i, currPos); 
     } 
    } 
    JOptionPane.showMessageDialog(null, list); 

} 
+1

別忘了,Swing是能夠呈現HTML,你可以生成輸出的HTML表格,並將其作爲消息參數 – MadProgrammer

回答

2

我猜你正在尋找的東西是這樣的:
enter image description here
你應該進行如下操作:

import javax.swing.JOptionPane; 
public class Permutation { 

public static void main(String[] args) throws Exception { 
    String str = null; 
    str = JOptionPane.showInputDialog("Enter a word"); 
    StringBuffer strBuf = new StringBuffer(str); 
    doPerm(strBuf,str.length()); 
    JOptionPane.showMessageDialog(null,sbuf.toString()); 
} 
static StringBuffer sbuf = new StringBuffer(); 
private static void doPerm(StringBuffer str, int index){ 
    String[] anArrayOfStrings; 
    if(index == 0){ 
     //System.out.println(str); 
     sbuf.append(str+"\n"); 
     }  
    else { 
     doPerm(str, index-1); 
     int currPos = str.length()-index; 
     for (int i = currPos+1; i < str.length(); i++) { 
      swap(str,currPos, i); 

      doPerm(str, index-1); 
      swap(str,i, currPos); 
     } 
    }  

} 


private static void swap(StringBuffer str, int pos1, int pos2){ 
    char t1 = str.charAt(pos1); 
    str.setCharAt(pos1, str.charAt(pos2)); 
    str.setCharAt(pos2, t1); 
} 

} 
+1

準確傳遞!謝謝 :) –

2

您正在使用遞歸。每次調用doPerm()方法時,您都不想創建新的ArrayList。相反,您可以在方法外部創建ArrayList,並在您每次調用ArrayList時將該ArrayList傳遞給該方法。喜歡的東西:

String str = null; 
str = JOptionPane.showInputDialog("Enter a word"); 
StringBuffer strBuf = new StringBuffer(str); 
List<String> list = new ArrayList<String>(); 
//doPerm(strBuf,str.length()); 
doPerm(list, strBuf,str.length()); 
System.out.println(list); 
//JOptionPane.showMessageDialog(null, list); 


//private static void doPerm(StringBuffer str, int index) 
private static void doPerm(List, list, StringBuffer str, int index) 
{ 
    //ArrayList<String> list = new ArrayList<String>(); 
    if(index == 0){ 
     list.add(str.toString()); 
     }  
    else { 
     //doPerm(str, index-1); 
     doPerm(list, str, index-1); 
     int currPos = str.length()-index; 
     for (int i = currPos+1; i < str.length(); i++) { 
      swap(str,currPos, i); 
      //doPerm(str, index-1); 
      doPerm(list, str, index-1); 
      swap(str,i, currPos); 
     } 
    }