//PowersetApp.java //power set in "binary number order" import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; public class PowersetApp extends JApplet { JTextField inputNField; int N; JLabel errorLabel; JTextArea listArea; Set powerset; TreeSet alphaPowerset; JRadioButton radioAlphaButton, radioSizeButton, radioBinaryButton; ButtonGroup buttonGroup; public void init() { Container container = getContentPane(); int panelRowsSize = 2; container.setLayout( new GridLayout( 1, panelRowsSize) ); JPanel [] panelRows = new JPanel[panelRowsSize]; //left side panel panelRows[0] = new JPanel(); container.add( panelRows[0] ); panelRows[0].setLayout( new GridLayout( 2, 1 ) ); JPanel topleftPanel = new JPanel(); panelRows[0].add( topleftPanel ); JPanel bottomleftPanel = new JPanel(); panelRows[0].add( bottomleftPanel ); bottomleftPanel.setLayout( new GridLayout( 3, 1 ) ); //right side panel panelRows[1] = new JPanel(); panelRows[1].setLayout( new FlowLayout() ); container.add( panelRows[1] ); powerset = new LinkedHashSet(); //for insertion order Font bigFont = new Font( "Monospaced", Font.BOLD, 16 ); TextFieldHandler handleTextField = new TextFieldHandler(); JLabel inputNLabel = new JLabel( "set size" ); inputNLabel.setFont( bigFont ); topleftPanel.add( inputNLabel ); inputNField = new JTextField( 3 ); inputNField.setFont( bigFont ); topleftPanel.add( inputNField ); inputNField.addActionListener( handleTextField ); errorLabel = new JLabel( "" ); errorLabel.setFont( bigFont ); topleftPanel.add( errorLabel ); radioAlphaButton = new JRadioButton( "Alphabetic order" ); bottomleftPanel.add( radioAlphaButton ); RadioButtonHandler radioButtonHandler = new RadioButtonHandler(); radioAlphaButton.addItemListener( radioButtonHandler ); radioSizeButton = new JRadioButton( "By size order" ); bottomleftPanel.add( radioSizeButton ); radioSizeButton.addItemListener( radioButtonHandler ); radioBinaryButton = new JRadioButton( "By binary order" ); bottomleftPanel.add( radioBinaryButton ); radioBinaryButton.addItemListener( radioButtonHandler ); buttonGroup = new ButtonGroup(); buttonGroup.add(radioAlphaButton); buttonGroup.add(radioSizeButton); buttonGroup.add(radioBinaryButton); listArea = new JTextArea( 20, 30 ); Font smallFont = new Font( "Monospaced", Font.BOLD, 12 ); listArea.setFont( smallFont ); JScrollPane listScroll = new JScrollPane( listArea ); panelRows[1].add( listScroll ); } public void start() { inputNField.requestFocusInWindow(); radioBinaryButton.setSelected( true ); } private class TextFieldHandler implements ActionListener { public void actionPerformed( ActionEvent event ) { errorLabel.setText( "" ); int n=0; try { n = Integer.parseInt( inputNField.getText() ); } catch (NumberFormatException e) { errorLabel.setText( "integer please" ); return; } if ( n <= 0 ) { errorLabel.setText( "positive integer please" ); return; } if ( n > 31 ) { errorLabel.setText( "<32 please" ); return; } N = n; //field N listArea.setText( "" ); char[] A="abcdefghijklmnopqrstuvwxyzABCDEF".toCharArray(); int two_n = 1 << n; powerset.clear(); //generate in binary number order for (int i=0; i<=two_n-1; i++) { String subset = ""; for (int j=0; j>j) & 1) == 1) subset += "" + A[j]; powerset.add( subset ); if ( radioAlphaButton.isSelected() ) alphaSort(); else if ( radioBinaryButton.isSelected() ) listArea.append( subset + "\n" ); else if ( radioSizeButton.isSelected() ) sizeSort(); } } } private void alphaSort() { listArea.setText( "" ); alphaPowerset = new TreeSet( powerset ); Iterator it = alphaPowerset.iterator(); while ( it.hasNext() ) { listArea.append( (String)it.next() ); listArea.append( "\n" ); } } private void sizeSort() { listArea.setText( "" ); String s; for (int size=0; size<=N; size++) { TreeSet sizePowerset = new TreeSet(); Iterator it = powerset.iterator(); //build set of length 'size' //System.out.println(""+size); while ( it.hasNext() ) { s = (String)it.next(); if ( s.length() == size ) sizePowerset.add( s ); } //iterate over the sorted set of length 'size' strings Iterator it2 = sizePowerset.iterator(); while ( it2.hasNext() ) { listArea.append( (String)it2.next() ); listArea.append( "\n" ); } } } private class RadioButtonHandler implements ItemListener { public void itemStateChanged( ItemEvent event ) { listArea.setText( "" ); if ( event.getSource() == radioAlphaButton ) { if ( radioAlphaButton.isSelected() ) alphaSort(); } else if ( event.getSource() == radioSizeButton ) { if ( radioSizeButton.isSelected() ) sizeSort(); } else if ( event.getSource() == radioBinaryButton ) { if ( radioBinaryButton.isSelected() ) { Iterator it = powerset.iterator(); while ( it.hasNext() ) { listArea.append( (String)it.next() ); listArea.append( "\n" ); } } } } } }