Avatar billede simeone Nybegynder
12. december 2003 - 21:25 Der er 17 kommentarer og
1 løsning

Input skal ordnes alfabetisk.

Hvad skal der til, for at input (ét ord ad gangen) i et JTextField ved tryk på en button bliver ført ned i et JTextArea, hvor input derefter bliver ordnet alfabetisk og med ét ord på hver linie? Se gerne ud fra nedenstående kode, om det kan lade sig gøre:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;  // til ActionListener

public class Evaluering extends JApplet implements ActionListener
{
  JLabel label;
  JTextField Txt1;
  JButton Knap;
  JTextArea Txt2;

  public void init()
  {
    JPanel contents = (JPanel)getContentPane();

    contents.setBackground(Color.white);

    label = new JLabel("Input");
    Txt1 = new JTextField();
    Knap = new JButton("Alfabetisér!");
    Txt2 = new JTextArea();

    contents.add(label);
    contents.add(Txt1);
    contents.add(Knap);
    contents.add(Txt2);

    Knap.addActionListener(this);

    JScrollPane scrollTextArea = new JScrollPane( Txt2 );

    // JPanel
      JPanel topPanel = new JPanel(new BorderLayout());
      topPanel.setOpaque(false);  // gennemsigtig


      //----- PLACERING AF KOMPONENTER i topPanel -----

      topPanel.add( label, BorderLayout.WEST );

      topPanel.add( Txt1, BorderLayout.CENTER );

      topPanel.add( Knap, BorderLayout.EAST );


      //----- PLACERING AF KOMPONENTER på applettens overflade -----

      contents.add( topPanel, BorderLayout.NORTH );

      contents.add( scrollTextArea, BorderLayout.CENTER );

  }

  public void actionPerformed(ActionEvent event)
  {
    String input = Txt1.getText();

      Txt2.setText(input);
  }
Avatar billede arne_v Ekspert
12. december 2003 - 21:33 #1
Prøv med noget ligesom dette:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*; // til ActionListener

import java.util.Arrays;

public class Evaluering extends JApplet implements ActionListener {
    JLabel label;
    JTextField Txt1;
    JButton Knap;
    JTextArea Txt2;

    public void init() {
        JPanel contents = (JPanel) getContentPane();

        contents.setBackground(Color.white);

        label = new JLabel("Input");
        Txt1 = new JTextField();
        Knap = new JButton("Alfabetisér!");
        Txt2 = new JTextArea();

        contents.add(label);
        contents.add(Txt1);
        contents.add(Knap);
        contents.add(Txt2);

        Knap.addActionListener(this);

        JScrollPane scrollTextArea = new JScrollPane(Txt2);

        // JPanel
        JPanel topPanel = new JPanel(new BorderLayout());
        topPanel.setOpaque(false); // gennemsigtig

        //----- PLACERING AF KOMPONENTER i topPanel -----

        topPanel.add(label, BorderLayout.WEST);

        topPanel.add(Txt1, BorderLayout.CENTER);

        topPanel.add(Knap, BorderLayout.EAST);

        //----- PLACERING AF KOMPONENTER på applettens overflade -----

        contents.add(topPanel, BorderLayout.NORTH);

        contents.add(scrollTextArea, BorderLayout.CENTER);

    }

    public void actionPerformed(ActionEvent event) {
        String input = Txt1.getText();
        String[] words = (Txt2.getText() + input).split("\n");
        Arrays.sort(words);
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < words.length; i++) {
            sb.append(words[i]);
            sb.append("\n");
        }
        Txt2.setText(sb.toString());
        Txt1.setText("");
    }
}
Avatar billede simeone Nybegynder
12. december 2003 - 22:26 #2
Jo tak, det virker fint... Men jeg tænkte på, om du måske lige kunne forklare mig den lidt nærmere? Jeg har selv rodet med det, men kunne ikke få det til at virke...
Avatar billede arne_v Ekspert
12. december 2003 - 22:30 #3
// først appender vi det nye ord til enden af de eksistende ord
        // og så splitter vi op i et array af ord
        String input = Txt1.getText();
        String[] words = (Txt2.getText() + input).split("\n");
        // vi sorterer ordene
        Arrays.sort(words);
        // vi samler de sorterede ord til en ny streng med linieskift mellem
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < words.length; i++) {
            sb.append(words[i]);
            sb.append("\n");
        }
        // vi putter den nye streng ind
        Txt2.setText(sb.toString());
        // vi blanker input hvor vi skal indtaste et nyt ord
        Txt1.setText("");
Avatar billede simeone Nybegynder
12. december 2003 - 22:38 #4
ja, okay, så er jeg med. Jeg skal egentlig også have en metode til at "vende" ordene om, så de bliver ordnet alfabetisk bagfra, men stadig er skrevet normalt. Det vil jeg dog lige rode med selv først, for jeg har en lille idé om det... Kan det passe, at det kan gøres med metoden reverseIt?
Avatar billede arne_v Ekspert
12. december 2003 - 22:44 #5
reverseIt kender jeg ikke.

Men jeg ved godt hvordan jeg ville gøre det.
Avatar billede simeone Nybegynder
12. december 2003 - 22:48 #6
ok, så hører du jo nok mere til mig senere :o)
Avatar billede arne_v Ekspert
12. december 2003 - 22:49 #7
Du behøver ikke oprette et nyt spørgsmål hvis du vil have min løsning
på omvendt sortering. Bare skriv her.
Avatar billede simeone Nybegynder
12. december 2003 - 22:54 #8
ok, will do...
Avatar billede simeone Nybegynder
13. december 2003 - 14:20 #9
Hmm, jeg har halvvejs fundet ud af det vha reverseIt:

private String reverseIt(String source)
{
int len = source.length();

  StringBuffer dest = new StringBuffer(len);

  for (int i = (len - 1); i >= 0; i--)
  dest.append(source.charAt(i));
   
  return dest.toString();

} // endof reverseIt

Men den ordner ikke ordene helt efter hensigten. De skulle jo ordnes "baglæns" alfabetisk, fx denne rækkefølge:

hjælpe
globalisering
sortering
cykler
mus 

Istedet bliver rækkefølgen:
cykler
globalisering
hjælpe
mus
sortering

Men den kan godt fonde ud af det ved lignende ord:
sorterina
sortering
sorterinh

Kan jeg desuden gøre noget, så input bliver bearbejdet ved tryk på "enter", og ikke kun ved at klikke med musen på Button?
Avatar billede arne_v Ekspert
13. december 2003 - 15:14 #10
Jeg troede faktisk at det bare var  c b a i.s.f. a b c du ønskede !

:-)

Sortering efter ordene bagfra kan du lave som:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*; // til ActionListener

import java.util.Arrays;
import java.util.Comparator;

public class Evaluering extends JApplet implements ActionListener {
    JLabel label;
    JTextField Txt1;
    JButton Knap;
    JTextArea Txt2;

    public void init() {
        JPanel contents = (JPanel) getContentPane();

        contents.setBackground(Color.white);

        label = new JLabel("Input");
        Txt1 = new JTextField();
        Knap = new JButton("Alfabetisér!");
        Txt2 = new JTextArea();

        contents.add(label);
        contents.add(Txt1);
        contents.add(Knap);
        contents.add(Txt2);

        Knap.addActionListener(this);

        JScrollPane scrollTextArea = new JScrollPane(Txt2);

        // JPanel
        JPanel topPanel = new JPanel(new BorderLayout());
        topPanel.setOpaque(false); // gennemsigtig

        //----- PLACERING AF KOMPONENTER i topPanel -----

        topPanel.add(label, BorderLayout.WEST);

        topPanel.add(Txt1, BorderLayout.CENTER);

        topPanel.add(Knap, BorderLayout.EAST);

        //----- PLACERING AF KOMPONENTER på applettens overflade -----

        contents.add(topPanel, BorderLayout.NORTH);

        contents.add(scrollTextArea, BorderLayout.CENTER);

    }

    public void actionPerformed(ActionEvent event) {
        String input = Txt1.getText();
        String[] words = (Txt2.getText() + input).split("\n");
        Arrays.sort(words, new RevSort());
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < words.length; i++) {
            sb.append(words[i]);
            sb.append("\n");
        }
        Txt2.setText(sb.toString());
        Txt1.setText("");
    }
}

class RevSort implements Comparator {
    public int compare(Object o1, Object o2) {
        String s1 = (String)o1;
        String s2 = (String)o2;
        return reverseIt(s1).compareTo(reverseIt(s2));
    }
    public boolean equals(Object obj) {
        return false;
    }
    private static String reverseIt(String source) {
        int len = source.length();
        StringBuffer dest = new StringBuffer(len);
        for (int i = (len - 1); i >= 0; i--)
            dest.append(source.charAt(i));
        return dest.toString();
    }
}
Avatar billede simeone Nybegynder
14. december 2003 - 13:46 #11
Hmm, det er stadig ikke helt, som det burde være. Det er kun ord med samme stamme, der bliver ordnet alfabetisk bagfra, fx:

sortering
sorterinh
sorterinn
sorterinå
spise

Hvor "spise" egentlig burde blive placeret forrest idet "es" kommer før "gn", "hn", "nn" og "ån". Her bliver det sorteret således at "sp" kommer efter "so", altså alfabetiseret forfra...
Avatar billede arne_v Ekspert
14. december 2003 - 15:58 #12
Når jeg bruger den kode jeg har postet ovenfor, så får jeg
"spise" før "sortering" !

Du har set andet argument til sort:

Arrays.sort(words, new RevSort());
Avatar billede simeone Nybegynder
14. december 2003 - 17:55 #13
Den har jeg ikke helt fanget... er der noget galt i ovenstående kode? For det er den jeg prøver med. Eller mangler der noget i den? Uanset hvad jeg gør, så ryger "spise" efter "sorterinå".
Avatar billede arne_v Ekspert
14. december 2003 - 18:03 #14
Nej min kode skulel virke.

Jeg spørger om du nå du tester har argiment nummer med til Arrays.sort ?

Fordi det er det som giver bagfra sorteringen.
Avatar billede simeone Nybegynder
14. december 2003 - 18:12 #15
Det var da lige godt utroligt... Om jeg begriber, at jeg ikke fangede den med det samme. Den var jo så åbenlys!
Avatar billede arne_v Ekspert
14. december 2003 - 20:56 #16
Og undskyld de mange tyrk fejl i min 18:03:39 kommentar - det er jo nærmest
ulæseligt.
Avatar billede repsak Nybegynder
14. december 2003 - 23:31 #17
arne_v -> hahah er du stadig påvirket efter en lystig julefrokost ;-) (siden de mange fejl i 18:03:39)
Avatar billede arne_v Ekspert
14. december 2003 - 23:36 #18
Faktisk ikke.

Rør aldrig alkohol.

Men julegave indkøb med konen det meste af dagen kan altså også
slå en mand ud.

:-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester