Advanced text manipulation (Java: Swing - LinkedList)

Συζητήσεις για την Java

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
agrippas
Script Master
Δημοσιεύσεις: 494
Εγγραφή: 18 Ιούλ 2002 14:52
Τοποθεσία: Υπερπέραν
Επικοινωνία:

Advanced text manipulation (Java: Swing - LinkedList)

Δημοσίευση από agrippas » 25 Νοέμ 2005 09:09

Στη Βρετανική τηλεόραση είναι ένα σεβαστό τηλεπαιχνίδι που λέγεται Countdown. Εκεί μαζεύονται κάτι απελπισμένοι παππούδες και τι κάνουν: Αν τους δώσουν 10 γράμματα στην τύχη, τους ζητάνε μέσα σε 30 δευτερόλεπτα να φτιάξουν όσο πιο μεγάλη λέξη γίνεται που να υπάρχει στο λεξικό και να μην είναι κύριο όνομα. Εκεί λοιπόν που τους έβλεπα και ιδρώνανε, μου ήρθε η έμπνευση να φτιάξω κάτι ανάλογο που θα κάνει την ίδια δουλειά και θα βγάζει αποτελέσματα με ένα κλικ του ποντικιού.

Χρησιμοποίησα Java σε Linux και το λεξικό του Linux που οι περισσότερες διανομές έχουν στο /usr/share/dict/words. Αν κάποιος από σας ανήκει στους ταλαίπωρους που έχουν απ' τα άλλα λειτουργικά συστήματα, εύκολα μπορεί να το προσαρμόσει και για άλλα λεξικά.

Το project ονομάζεται fdictionary και χρησιμοποιεί GUI βασισμένο στο look & feel του com.sun.java.swing.plaf.gtk.GTKLookAndFeel, το GTK είναι το πιο κοινό στο Linux. Πάλι, αν κάποιος κακορίζικος έχει απ' τα άλλα λειτουργικά συστήματα, μπορεί να το αλλάξει και να βάλει τα βαρετά εκείνα μπιχλιμπίδια που έχει το λειτουργικό που πλήρωσε.

Εκτός από το source, σας δίνω και το .jar αρχείο για να δείτε τι καλός άνθρωπος που μπορώ να γίνω ώρες ώρες.

Και ξεκινάω επιστημονική ανάλυση: Οι κλάσεις που έφτιαξα είναι 4. Η Main που φορτώνει το GUI, το ίδιο το GUI, η κλάση Dictionary που κάνει όλη την επεξεργασία στο λεξικό και μια κλάση FDTools που έβαλα κάποια utilities και κάποια overrides. Για να καταλάβετε τι γίνεται εσείς που διαβάζετε, πρέπει να ξέρετε τι είναι το LinkedList, το Thread και το Object. Επίσης πρέπει να ξέρετε και αγγλικά γιατί έχω γράψει το javadoc σε αυτή τη γλώσσα.

1. GUI

Αν και ελέγχει όλη τη ροή του προγράμματος, δεν αξίζει να δώσετε μεγάλη βάση εδώ εκτός αν σας ενδιαφέρει πολύ το Swing.

Κώδικας: Επιλογή όλων

/*
 * GUI.java
 * Aris Agrippas
 * September 29, 2005, 7:43 PM
 */

package fdictionary;

import java.util.LinkedList;
import java.awt.*;
import javax.swing.*;
import java.util.prefs.*;
import java.io.*;

public class GUI extends javax.swing.JFrame {

    private javax.swing.JButton jButton;
    private javax.swing.JCheckBox jCheckBox1;
    private javax.swing.JComboBox jComboBox;
    public javax.swing.JTextField jInput;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JProgressBar jProgressBar;
    public javax.swing.JTextArea jResults;
    private javax.swing.JScrollPane jScrollPane1;
    
    private Preferences prefs = Preferences.userNodeForPackage(GUI.class);

    JTextField formInput = new JTextField();
    JTextArea formResults = new JTextArea();
    JFileChooser formFile = new JFileChooser();
    JCheckBox formCheck = new JCheckBox();
    JProgressBar formBar = new JProgressBar();
    static JComboBox formCombo = new JComboBox();

    public int counter = 0;
    
    /** Creates new form GUI */
    public GUI() {
        initComponents();
        
        // get the preferences
        if (!prefs.getBoolean("showall", true)) jCheckBox1.setSelected(false);
        for&#40;int i = 3; i<=11; i++&#41;&#123;
            jComboBox.addItem&#40;String.valueOf&#40;i&#41;&#41;;
        &#125;
        jComboBox.setSelectedItem&#40;prefs.get&#40;"minLetters","4"&#41;&#41;;

        this.setSize&#40;640, 480&#41;;

        String look = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel";
        setLookAndFeel&#40;look&#41;;
        
        formInput = this.jInput;
        formResults = this.jResults;
        formCheck = this.jCheckBox1;
        formCombo = this.jComboBox;
        formBar = this.jProgressBar;
    &#125;
    
    private void initComponents&#40;&#41; &#123;
        jInput = new javax.swing.JTextField&#40;&#41;;
        jButton = new javax.swing.JButton&#40;&#41;;
        jLabel1 = new javax.swing.JLabel&#40;&#41;;
        jScrollPane1 = new javax.swing.JScrollPane&#40;&#41;;
        jResults = new javax.swing.JTextArea&#40;&#41;;
        jCheckBox1 = new javax.swing.JCheckBox&#40;&#41;;
        jComboBox = new javax.swing.JComboBox&#40;&#41;;
        jProgressBar = new javax.swing.JProgressBar&#40;&#41;;
        jLabel2 = new javax.swing.JLabel&#40;&#41;;
        jLabel3 = new javax.swing.JLabel&#40;&#41;;

        getContentPane&#40;&#41;.setLayout&#40;null&#41;;

        setDefaultCloseOperation&#40;javax.swing.WindowConstants.EXIT_ON_CLOSE&#41;;
        setTitle&#40;"FDictionary"&#41;;
        setResizable&#40;false&#41;;
        addWindowListener&#40;new java.awt.event.WindowAdapter&#40;&#41; &#123;
            public void windowClosing&#40;java.awt.event.WindowEvent evt&#41; &#123;
                formWindowClosing&#40;evt&#41;;
            &#125;
        &#125;&#41;;

        jInput.setFont&#40;new java.awt.Font&#40;"Default", 1, 12&#41;&#41;;
        jInput.setBorder&#40;null&#41;;
        jInput.addKeyListener&#40;new java.awt.event.KeyAdapter&#40;&#41; &#123;
            public void keyTyped&#40;java.awt.event.KeyEvent evt&#41; &#123;
                jInputKeyTyped&#40;evt&#41;;
            &#125;
        &#125;&#41;;

        getContentPane&#40;&#41;.add&#40;jInput&#41;;
        jInput.setBounds&#40;10, 389, 280, 22&#41;;

        jButton.setBackground&#40;new java.awt.Color&#40;224, 224, 224&#41;&#41;;
        jButton.setText&#40;"Shoot!"&#41;;
        jButton.addActionListener&#40;new java.awt.event.ActionListener&#40;&#41; &#123;
            public void actionPerformed&#40;java.awt.event.ActionEvent evt&#41; &#123;
                jButtonActionPerformed&#40;evt&#41;;
            &#125;
        &#125;&#41;;

        getContentPane&#40;&#41;.add&#40;jButton&#41;;
        jButton.setBounds&#40;504, 388, 110, 25&#41;;

        jLabel1.setFont&#40;new java.awt.Font&#40;"Default", 0, 12&#41;&#41;;
        jLabel1.setForeground&#40;new java.awt.Color&#40;135, 135, 159&#41;&#41;;
        jLabel1.setText&#40;"Aris Agrippas &#40;c&#41; 2005"&#41;;
        getContentPane&#40;&#41;.add&#40;jLabel1&#41;;
        jLabel1.setBounds&#40;10, 360, 210, 15&#41;;

        jResults.setEditable&#40;false&#41;;
        jResults.setFont&#40;new java.awt.Font&#40;"Default", 0, 12&#41;&#41;;
        jResults.setLineWrap&#40;true&#41;;
        jResults.setWrapStyleWord&#40;true&#41;;
        jResults.setBorder&#40;null&#41;;
        jResults.setMargin&#40;new java.awt.Insets&#40;10, 10, 10, 10&#41;&#41;;
        jScrollPane1.setViewportView&#40;jResults&#41;;

        getContentPane&#40;&#41;.add&#40;jScrollPane1&#41;;
        jScrollPane1.setBounds&#40;13, 13, 600, 340&#41;;

        jCheckBox1.setFont&#40;new java.awt.Font&#40;"Default", 0, 12&#41;&#41;;
        jCheckBox1.setSelected&#40;true&#41;;
        jCheckBox1.setText&#40;"Να φαίνονται μόνο οι μεγαλύτερες λέξεις"&#41;;
        getContentPane&#40;&#41;.add&#40;jCheckBox1&#41;;
        jCheckBox1.setBounds&#40;10, 420, 340, 23&#41;;

        jComboBox.setFont&#40;new java.awt.Font&#40;"Default", 1, 12&#41;&#41;;
        getContentPane&#40;&#41;.add&#40;jComboBox&#41;;
        jComboBox.setBounds&#40;412, 389, 50, 22&#41;;

        jProgressBar.setForeground&#40;new java.awt.Color&#40;204, 0, 0&#41;&#41;;
        jProgressBar.setOpaque&#40;false&#41;;
        getContentPane&#40;&#41;.add&#40;jProgressBar&#41;;
        jProgressBar.setBounds&#40;10, 360, 600, 14&#41;;

        jLabel2.setFont&#40;new java.awt.Font&#40;"Default", 0, 12&#41;&#41;;
        jLabel2.setText&#40;"Τουλάχιστον"&#41;;
        getContentPane&#40;&#41;.add&#40;jLabel2&#41;;
        jLabel2.setBounds&#40;330, 394, 90, 15&#41;;

        jLabel3.setFont&#40;new java.awt.Font&#40;"Default", 0, 12&#41;&#41;;
        jLabel3.setText&#40;"γρ."&#41;;
        getContentPane&#40;&#41;.add&#40;jLabel3&#41;;
        jLabel3.setBounds&#40;470, 394, 30, 15&#41;;

        pack&#40;&#41;;
    &#125;

    private void jInputKeyTyped&#40;java.awt.event.KeyEvent evt&#41; &#123;                                
        if&#40;evt.getKeyChar&#40;&#41; == evt.VK_ENTER&#41; getItDone&#40;&#41;;
    &#125;                               

    private void formWindowClosing&#40;java.awt.event.WindowEvent evt&#41; &#123;                                   
        prefs.putBoolean&#40;"showall", jCheckBox1.isSelected&#40;&#41;&#41;;
        prefs.put&#40;"minLetters", jComboBox.getSelectedItem&#40;&#41;.toString&#40;&#41;&#41;;
    &#125;                                  
        
    private void jButtonActionPerformed&#40;java.awt.event.ActionEvent evt&#41; &#123;                                        
        getItDone&#40;&#41;;
    &#125;                                       

    private void getItDone&#40;&#41;&#123;
        jResults.setText&#40;null&#41;;

        LinkedList words = new LinkedList&#40;&#41;;
        String userInput = new String&#40;jInput.getText&#40;&#41;&#41;;
        
        // user-input checking
        if&#40;userInput.length&#40;&#41; == 0&#41;&#123;
            jResults.setText&#40;"Πρέπει να δώσεις γράμματα στο κουτάκι κάτω."&#41;;
            jInput.requestFocus&#40;&#41;;
            return;
        &#125; else if &#40;userInput.length&#40;&#41; < 
                Integer.parseInt&#40;jComboBox.getSelectedItem&#40;&#41;.toString&#40;&#41;&#41;&#41;&#123;
            jResults.setText&#40;"Δε μπορώ να σου βγάλω λέξεις που να έχουν " +
                    "πιο πολλά γράμματα απ' όσα έδωσες, δώσε περισσότερα."&#41;;
            return;
        &#125;
        userInput = userInput.replaceAll&#40;" ", ""&#41;;
        userInput = userInput.replaceAll&#40;",", ""&#41;;
        
        
        char&#91;&#93; charInput= userInput.toLowerCase&#40;&#41;.toCharArray&#40;&#41;;
        final String&#91;&#93; userArgs = new String&#91;charInput.length&#93;;
        final Dictionary dictionary = new Dictionary&#40;words, userArgs&#41;;
        
        for&#40;int i = 0; i < userArgs.length; i++&#41;&#123;
            userArgs&#91;i&#93; = "" + charInput&#91;i&#93;;
        &#125;
        
        activateComps&#40;false&#41;;
        jLabel1.setVisible&#40;false&#41;;
        jProgressBar.setVisible&#40;true&#41;;
        jProgressBar.setValue&#40;0&#41;;
        jResults.setText&#40;"Διαβάζω το λεξικό\t\t\t"&#41;;
        
        final Thread thReadDictionary = new Thread&#40;&#41;&#123;
          public void run&#40;&#41;&#123;
              try&#123;
                  dictionary.read&#40;"/usr/share/dict/words"&#41;;
              &#125; catch&#40;IOException e&#41;&#123;;&#125;
              SwingUtilities.invokeLater&#40;new Runnable&#40;&#41;&#123;
                  public void run&#40;&#41;&#123;
                      jResults.append&#40;"&#91; OK &#93;\n" + "Έδωσες&#58; " 
                              + FDTools.toString&#40;userArgs&#41; 
                              + " &#40;" + userArgs.length + " γράμματα&#41;\n" 
                              + "Ψάχνω για λέξεις...\t\t\t"&#41;;
                      jProgressBar.setValue&#40;10&#41;;
                  &#125;
              &#125;&#41;;
          &#125;  
        &#125;;
            
        thReadDictionary.start&#40;&#41;;

        final Thread thFindWords= new Thread&#40;&#41;&#123;
          public void run&#40;&#41;&#123;
              try&#123;
                  while &#40;thReadDictionary.isAlive&#40;&#41;&#41;&#123;
                      sleep&#40;1&#41;;
                  &#125;
              &#125; catch&#40;InterruptedException ex&#41;&#123;;&#125;
              dictionary.cleanupList&#40;&#41;;
              SwingUtilities.invokeLater&#40;new Runnable&#40;&#41;&#123;
                  public void run&#40;&#41;&#123;
                      jResults.append&#40;"&#91; OK &#93;\n"&#41;;
                      jProgressBar.setValue&#40;90&#41;;
                  &#125;
              &#125;&#41;;
          &#125;  
        &#125;;
        
        thFindWords.start&#40;&#41;;

        Thread thShowResults= new Thread&#40;&#41;&#123;
          public void run&#40;&#41;&#123;
              try&#123;
                  while &#40;thFindWords.isAlive&#40;&#41;&#41;&#123;
                      sleep&#40;1&#41;;
                  &#125;
              &#125; catch&#40;InterruptedException ex&#41;&#123;;&#125;
              final String result 
                      = dictionary.makeResults&#40;!jCheckBox1.isSelected&#40;&#41;&#41;;
              SwingUtilities.invokeLater&#40;new Runnable&#40;&#41;&#123;
                  public void run&#40;&#41;&#123;
                      activateComps&#40;true&#41;;
                      jResults.append&#40;result + "\n"&#41;;
                          jProgressBar.setValue&#40;100&#41;;
                      jInput.requestFocus&#40;&#41;;
                  &#125;
              &#125;&#41;;
          &#125;  
        &#125;;
        
        thShowResults.start&#40;&#41;;        
    &#125;
    private void activateComps&#40;boolean b&#41;&#123;
        jButton.setEnabled&#40;b&#41;;
        jComboBox.setEnabled&#40;b&#41;;
        jInput.setEditable&#40;b&#41;;
        jCheckBox1.setEnabled&#40;b&#41;;
    &#125;
    
    private void setLookAndFeel&#40;String look&#41;&#123;
        try&#123;
            UIManager.setLookAndFeel&#40;look&#41;;
        &#125; catch &#40;Exception e&#41;&#123;
            System.out.println&#40;"Error applying style"&#41;;
        &#125;
        for &#40;int i = 0; i < this.getComponentCount&#40;&#41;; i++&#41;&#123;
            SwingUtilities.updateComponentTreeUI&#40;this.getComponent&#40;i&#41;&#41;;
        &#125;
    &#125;
&#125;

2. Main.java

Δείχνουμε απλά το GUI:

Κώδικας: Επιλογή όλων

/*
 * Main.java
 * Aris Agrippas
 * September 27, 2005, 10&#58;59 PM
 */

package fdictionary;

public class Main &#123;
    
    public static GUI gui = new GUI&#40;&#41;;
    public static String msg = new String&#40;""&#41;;
    
    public static void main&#40;String&#91;&#93; args&#41; throws java.io.IOException&#123;
        gui.formBar.setVisible&#40;false&#41;;
        gui.show&#40;&#41;;
        gui.formInput.requestFocus&#40;&#41;;
    &#125;
&#125;
3. FDTools.java

Κώδικας: Επιλογή όλων

/*
 * FDTools.java
 * Aris Agrippas
 * October 10, 2005, 2&#58;16 AM
 */

package fdictionary;

import java.util.LinkedList;
import java.util.ListIterator;

public class FDTools&#123;
    
    /**
     *Returns a String representation of a String array.
     *The returned String is comma separated, i.e. word1, word2, ...
     */
    public static String toString&#40;String&#91;&#93; strArray&#41;&#123;
        String strOutput = "";
        for&#40;int i = 0; i < strArray.length; i++&#41;&#123;
            if &#40;i == 0&#41; strOutput = strArray&#91;i&#93;;
            else strOutput  += ", " + strArray&#91;i&#93;;
        &#125;
        return strOutput;
    &#125;

    /**
     *Calculates how many times a single letter appears in a String.
     *i.e. when you call letAppear&#40;"mountain", 'n'&#41; you get back the integer 2.
     */
    public static int letAppear&#40;String str, char letter&#41;&#123;
        int i = -1;
        int j = 0;
        while&#40;i < str.lastIndexOf&#40;letter&#41; && str.indexOf&#40;letter&#41; != -1&#41;&#123;
            str = str.substring&#40;i + 1&#41;;
            i = str.indexOf&#40;letter&#41;;
            j++;
        &#125;
        return j;
    &#125;

    /**
     *Sorts a String array with respect to the length of its contents. The sorting
     *is from the longer to the shorter.
     */
    public static String&#91;&#93; sortArrayBySize&#40;String&#91;&#93; arr, int step&#41;&#123;
        int arsize = arr.length;
        if &#40;step >= &#40;arsize&#41;&#41; return arr;
        int big = arr&#91;step&#93;.length&#40;&#41;;
        int bigposition = 0;
        boolean changed = false;
        
        for &#40;int i = step; i < arr.length; i++&#41;&#123;
            if &#40;arr&#91;i&#93;.length&#40;&#41; > big&#41;&#123;
                big = arr&#91;i&#93;.length&#40;&#41;;
                bigposition = i;
                changed = true;
            &#125;
        &#125;
        if &#40;changed&#41;&#123;
            String tmp = arr&#91;step&#93;;
            arr&#91;step&#93; = arr&#91;bigposition&#93;;
            arr&#91;bigposition&#93; = tmp;
        &#125;
        
        return sortArrayBySize&#40;arr, ++step&#41;;
    &#125;

    /**
     *You give a LinkedList, you get back a String array with the LinkedList's
     *<tt>.toString</tt> values.
     */
    public static String&#91;&#93; toStringArray&#40;LinkedList llist&#41;&#123;
        String&#91;&#93; result = new String&#91;llist.size&#40;&#41;&#93;;
        ListIterator i = llist.listIterator&#40;&#41;;
        int j = 0;
        while &#40;i.hasNext&#40;&#41;&#41;&#123;
            result&#91;j&#93; = i.next&#40;&#41;.toString&#40;&#41;;
            j++;
        &#125;
        return result;
    &#125;

&#125;
4. Dictionary.java

Κώδικας: Επιλογή όλων

/*
 * Dictionary.java
 * Aris Agrippas
 * September 27, 2005, 11&#58;01 PM
 */

package fdictionary;

import java.util.LinkedList;
import java.util.ListIterator;
import java.io.*;
import java.awt.*;
import javax.swing.*;


public class Dictionary extends LinkedList&#123;
    
    private LinkedList _dictionary;
    private String&#91;&#93; _letters;
    
    public Dictionary&#40;LinkedList dictionary, String&#91;&#93; letters&#41; &#123;
        _dictionary = dictionary;
        _letters = letters;
    &#125;
    
/**
 *Loads the dictionary from the given <b>dictpath</b>. The dictpath must be
 *the full path including the filename of the dictionary and the file must be
 *in plain text with line-separated words.
 **/
    public void read&#40;String dictpath&#41; throws java.io.IOException&#123;
        String inputLine = new String&#40;&#41;;
        int i = 0;
        try&#123;
            BufferedReader br = new BufferedReader&#40;new FileReader&#40;dictpath&#41;&#41;;
            while&#40;&#40;inputLine = br.readLine&#40;&#41;&#41; != null&#41;&#123;
                _dictionary.add&#40;inputLine&#41;;
                i++;
            &#125;
            br.close&#40;&#41;;
        &#125; catch &#40;IOException e&#41;&#123;
            System.err.println&#40;e&#41;;
            System.exit&#40;1&#41;;
        &#125;
    &#125;
    
    /**
     *Cleans up the dictionary from unwanted words like&#58;
     *<ul><li>words that start with &#40;or include&#41; capital letters or numbers</li>
     *<li>words that have no letters given by the user</li>
     *<li>words that have a letter appearing more times than it appears in the 
     *given by the user letters</li></ul>
     **/
    public void cleanupList&#40;&#41;&#123;
        ListIterator i = _dictionary.listIterator&#40;&#41;;
        String w = new String&#40;""&#41;;
        String lett = FDTools.toString&#40;_letters&#41;.replaceAll&#40;", ",""&#41;;
        boolean badw = false;
        int minLetters = java.lang.Integer.parseInt
                &#40;GUI.formCombo.getSelectedItem&#40;&#41;.toString&#40;&#41;&#41;;
        while &#40;i.hasNext&#40;&#41;&#41;&#123;
            w = i.next&#40;&#41;.toString&#40;&#41;;
            if &#40;w.length&#40;&#41; < minLetters || w.length&#40;&#41; > _letters.length 
                    || w.matches&#40;".*&#91;A-Z0-9&#93;.*&#91;_-&#93;.*"&#41;&#41;&#123;
                i.remove&#40;&#41;;
            &#125; else &#123;
                for&#40;int j = 0; j < w.length&#40;&#41;; j++&#41;&#123;
                    if&#40;FDTools.letAppear&#40;w, w.charAt&#40;j&#41;&#41; > FDTools.letAppear&#40;lett, w.charAt&#40;j&#41;&#41;&#41;&#123;
                        i.remove&#40;&#41;;
                        break;
                    &#125;
                &#125;
            &#125;
        &#125;
    &#125;
    
    /**
     *Returns the results as a String, in an easy-readable format. It actually
     *is the dictionary itself, sorted with respect to the length of the words.
     **/
    public String makeResults&#40;boolean showAll&#41;&#123;
        int i = 0;
        int allW = _dictionary.size&#40;&#41;;
        int currSize = 0;
        int prevSize = 0;
        int minLetters = java.lang.Integer.parseInt
                &#40;GUI.formCombo.getSelectedItem&#40;&#41;.toString&#40;&#41;&#41;;
        String&#91;&#93; unsortedRslt = FDTools.toStringArray&#40;_dictionary&#41;;
        String&#91;&#93; sortedRslt = FDTools.sortArrayBySize&#40;unsortedRslt, 0&#41;;
        String msg1 = "Πάω να δείξω λέξεις με τουλάχιστον " + minLetters + " γράμματα\n";
        String msg2 = "";
        
        for &#40;i = 0; i < sortedRslt.length; i++&#41;&#123;
            currSize = sortedRslt&#91;i&#93;.length&#40;&#41;;
            if &#40;currSize != prevSize&#41;&#123;
                if &#40;prevSize != 0&#41; msg2 += "\n";
                prevSize = currSize;
            &#125;
            msg2 += sortedRslt&#91;i&#93; + "\t" + currSize + " γρ.\n";
            if&#40;&#40;i > 10&#41; && &#40;currSize <= &#40;minLetters + 3&#41;&#41; && !showAll&#41; break;
        &#125;
        //      make msg1
        if&#40;i == 0&#41;&#123;             // no results
            msg1 += "Δε βρήκα τίποτα";
        &#125; else if &#40;i == 1&#41;&#123;     // a single word
            msg1 += "Να η μοναδική λέξη που βρήκα&#58;";
        &#125; else &#123;                // many words
            if&#40;!showAll&#41;
                msg1 += "Να " + i + " από τις " + allW + " λέξεις που βρήκα&#58;";
            else
                msg1 += "Να όλες οι " + allW + " λέξεις που βρήκα&#58;";
        &#125;
        msg1 += "\n\n";
        return msg1 + msg2;
    &#125;
&#125;
Download the compiled jar archive (Linux users only)

Όποιος έχει απορίες, εδώ είμαι.
Τελευταία επεξεργασία από το μέλος agrippas την 09 Μαρ 2008 22:27, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27622
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Advanced text manipulation (Java: Swing - LinkedList)

Δημοσίευση από cordis » 25 Νοέμ 2005 11:36

ωραίος ο Άρης.. ;)
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Άβαταρ μέλους
xmavidis
Honorary Member
Δημοσιεύσεις: 1217
Εγγραφή: 02 Δεκ 2003 19:59
Τοποθεσία: Ηράκλειο

Advanced text manipulation (Java: Swing - LinkedList)

Δημοσίευση από xmavidis » 25 Νοέμ 2005 17:52

Ωραίος! :)
I want to know God’s thoughts; the rest are details.
Albert Einstein

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Advanced text manipulation (Java: Swing - LinkedList)

Δημοσίευση από skeftomilos » 27 Νοέμ 2005 01:18

Ό,τι πληρώνεις παίρνεις. Ένα τζάμπα λειτουργικό τι σόι καλό λειτουργικό μπορεί να είναι; :P :D :lol:

Αλήθεια από performance πώς τα πάει το πρόγραμμα; Παρακαλώ όχι σχόλια για δόντια, γαϊδάρους και χαρίσματα. :)
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
agrippas
Script Master
Δημοσιεύσεις: 494
Εγγραφή: 18 Ιούλ 2002 14:52
Τοποθεσία: Υπερπέραν
Επικοινωνία:

Advanced text manipulation (Java: Swing - LinkedList)

Δημοσίευση από agrippas » 27 Νοέμ 2005 10:31

Μια χαρά πάει αλλά μπορεί και καλύτερα. Δηλ. η sortArrayBySize ίσως μπορεί να ξαναγραφτεί με πιο γρήγορο αλγόρθιμο αλλά δε με πειράζει και τόσο γιατί ο array που φτιάχνει αυτή είναι ήδη αρκετά μικρός. Βασικά το ξεσκάρτεμα των άχρηστων λέξεων γίνεται νωρίς οπότε κουβαλάμε όσο πιο λίγες γίνεται. Σε Pentium M 1.4 GHz, δίνοντας 10 γράμματα και διαλέγοντας να δείξει λέξεις με τουλάχιστον 8, το output γίνεται σε 3 δευτερόλεπτα (το λεξικό έχει μισό εκατομμύριο λέξεις).

Κώδικας: Επιλογή όλων

Διαβάζω το λεξικό			&#91; OK &#93;
Έδωσες&#58; e, r, f, r, b, y, a, t, o, s &#40;10 γράμματα&#41;
Ψάχνω για λέξεις...			&#91; OK &#93;
Πάω να δείξω λέξεις με τουλάχιστον 8 γράμματα
Να όλες οι 9 λέξεις που βρήκα&#58;

ferryboats	10 γρ.

ferryboat	9 γρ.

aborters	8 γρ.
forayers	8 γρ.
forbears	8 γρ.
forebays	8 γρ.
forestay	8 γρ.
forestry	8 γρ.
taborers	8 γρ.
Τώρα για το λειτουργικό και τις φαρμακερές κακίες που λέει ο σκουφόμαλλος, φυσικά και δε θα πω πως γάιδαρο του δίνανε κι αυτός τον κοίταζε στα δόντια. Αντιθέτως θα αναφερθώ υπερήφανα στις εκατοντάδες χιλιάδες ανθρώπων που τρέχουν το πρόγραμμά μου με το ενσωματωμένο λεξικό που δίνει το Linux: Πλέον αισθάνονται ευτυχείς και ανώτεροι που βρίσκουν τις λέξεις πριν από τους απελπισμένους Βρετανούς παππούδες στο τηλεπαιχνίδι. :brushteeth:

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Advanced text manipulation (Java: Swing - LinkedList)

Δημοσίευση από cherouvim » 29 Νοέμ 2005 08:55

Ωραία πράγματα.. και respect στο countdown! I miss it.

Άβαταρ μέλους
agrippas
Script Master
Δημοσιεύσεις: 494
Εγγραφή: 18 Ιούλ 2002 14:52
Τοποθεσία: Υπερπέραν
Επικοινωνία:

Advanced text manipulation (Java: Swing - LinkedList)

Δημοσίευση από agrippas » 29 Νοέμ 2005 23:09

Για όσους άλλους εκτός του cherouvim που το παρακολουθούσαν στο Channel 4, εδώ υπάρχει η βιογραφία του παρουσιαστή του, μακαρίτη πια Richard Whiteley:

http://en.wikipedia.org/wiki/Richard_Whiteley

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Advanced text manipulation (Java: Swing - LinkedList)

Δημοσίευση από cherouvim » 29 Νοέμ 2005 23:16

Damn! Δεν ήξερα οτι πέθανε. RIP dude!

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Advanced text manipulation (Java: Swing - LinkedList)

Δημοσίευση από skeftomilos » 30 Νοέμ 2005 09:27

Γιούπι! Κατάφερα και το έκανα compile! :D Μόνο που έβαλα όλο τον κώδικα σε ένα αρχείο γιατί διαφορετικά δεν έχω ιδέα πώς γίνεται. Έβγαλα και τα package fdictionary; γιατί όλο σφάλματα έβγαιναν.

Εικόνα

Το μόνο μελανό σημείο εντοπίζεται στη ζοφερή φρασεολογία του προγράμματος. Όμως το αντιπαρέρχομαι γιατί τοιούτες εκφράσεις δε συμβαδίζουν με την κομψότητα και ανωτερότητα του επώνυμου και μοδάτου λειτουργικού μου συστήματος. :snooty::snooty:
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Advanced text manipulation (Java: Swing - LinkedList)

Δημοσίευση από skeftomilos » 14 Δεκ 2005 04:52

Μία έκδοση του παιχνιδιού γραμμένη με JavaScript: online demo

Εικόνα

Όποιος θέλει μπορεί να κατεβάσει μια εξ ολοκλήρου client-side έκδοση που τρέχει και off-line (206 KB).

Το ελληνικό λεξικό που βρήκα δεν είναι και πολύ καλό. Αν έχει κανείς κάποιο πληρέστερο λεξικό ας μου το στείλει please για να αντικαταστήσω το υπάρχον. :)
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
agrippas
Script Master
Δημοσιεύσεις: 494
Εγγραφή: 18 Ιούλ 2002 14:52
Τοποθεσία: Υπερπέραν
Επικοινωνία:

Advanced text manipulation (Java: Swing - LinkedList)

Δημοσίευση από agrippas » 14 Δεκ 2005 18:40

Πολύ μου άρεσε αυτή η προσέγγιση και σαν εκτέλεση και σαν κώδικας. Έφτιαξες το παιχνίδι αυτό καθεαυτό (και τη λύση), ενώ εγώ είχα φτιάξει μόνο τη λύση. Ο κώδικας είναι πολύ συνεπτυγμένος και τσίφτικος. Well done.

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Advanced text manipulation (Java: Swing - LinkedList)

Δημοσίευση από skeftomilos » 15 Δεκ 2005 11:11

Thanks Agrippas! :) Με JavaScript δεν ήταν δυνατό να γίνει με brute force όπως έκανες με τη Java γιατί το script τρέχει και τρέχει και τρέεεχει, η CPU στενάζει και σφυρίζει, το ανεμιστηράκι γυρίζει σαν τρελό και τελικά ... βγαίνει αυτό:

Εικόνα

:doh::doh::doh:
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
Basilakis
PHP Moderator
Δημοσιεύσεις: 8574
Εγγραφή: 17 Νοέμ 2003 13:03
Τοποθεσία: Womans' Brain
Επικοινωνία:

Advanced text manipulation (Java: Swing - LinkedList)

Δημοσίευση από Basilakis » 15 Δεκ 2005 11:17

Para poly kalo. Egw twra mathenw Java, javascript kati skampazw kai tha to treksw na to dw. Poly kalh douleia man!

Απάντηση

Επιστροφή στο “Java”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες