Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Java: Seuraava vokaali

JRokka [28.11.2019 17:32:57]

#

Tämä ohjelma etsii merkkijonosta vokaalit. Kun ollaan merkkijonon lopussa, aloitetaan alusta.

Koodi

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.ArrayList;

public class Vokaalit extends JApplet implements ActionListener {
    //Luodaan objektit
    //Rivi 1
    JPanel rivi1 = new JPanel();
    JLabel teksti = new JLabel("0");
    //Rivi 2
    JPanel rivi2 = new JPanel();
    JTextField tlaatikko = new JTextField(10);
    //Rivi 3
    JPanel rivi3 = new JPanel();
    JButton nappain_1 = new JButton("Aseta");
    JButton nappain_2  = new JButton("Seuraava vokaali");

    public void init(){
        //Asetellaan objektit.
        GridLayout appletinAsettelu = new GridLayout(5,1,10,10);
        Container ruutu = getContentPane();
        ruutu.setLayout(appletinAsettelu);
        //Lisätään kuuntelijat.
        nappain_1.addActionListener(this);
        nappain_2.addActionListener(this);
        //Ensimmäinen rivi
        FlowLayout asettelu1 = new FlowLayout(FlowLayout.CENTER,10,10);
        rivi1.setLayout(asettelu1);
        rivi1.add(teksti);
        ruutu.add(rivi1);
        //Toinen rivi
        FlowLayout asettelu2 = new FlowLayout(FlowLayout.CENTER,10,10);
        rivi2.setLayout(asettelu2);
        rivi2.add(tlaatikko);
        ruutu.add(rivi2);
        //Kolmas rivi
        FlowLayout asettelu3 = new FlowLayout(FlowLayout.CENTER,10,10);
        rivi3.setLayout(asettelu3);
        rivi3.add(nappain_1);
        rivi3.add(nappain_2);
        ruutu.add(rivi3);
        setContentPane(ruutu);
    }
    int indeksi = 0;
    String mjn = "";
    public void actionPerformed(ActionEvent e){
        String komento = e.getActionCommand();
        if (komento.equals("Aseta")){
            //Asetetaan mjono.
            mjn = tlaatikko.getText();
        }
        else if (komento.equals("Seuraava vokaali")){
            //Etsitään seuraava vokaali
            do {
                if (indeksi < mjn.length()-1){
                    //Luku ei saa mennä ArrayListin yli
                    indeksi++;
                }

            } while (mjn.charAt(indeksi) != 'a' && mjn.charAt(indeksi) != 'e' && mjn.charAt(indeksi) != 'i' && mjn.charAt(indeksi) != 'o' && mjn.charAt(indeksi) != 'u' && mjn.charAt(indeksi) != 'y' && indeksi < mjn.length()-1);
            //Aloitetaan laskenta alusta, jos ollaan lopussa.
            if (mjn.charAt(indeksi) != 'a' && mjn.charAt(indeksi) != 'e' && mjn.charAt(indeksi) != 'i' && mjn.charAt(indeksi) != 'o' && mjn.charAt(indeksi) != 'u' && mjn.charAt(indeksi) != 'y' && indeksi < mjn.length()-1){
                indeksi = -1;
            }
            //Näytetään luku.
            if (indeksi != -1){
                teksti.setText(String.valueOf(mjn.charAt(indeksi)));
            }
            if (indeksi == mjn.length()-1){
                indeksi = -1;
            }

        }

    }
}

The Alchemist [29.11.2019 03:58:47]

#

Tämä koodi on niin surkea räpellys, että pakko olla spammitrollausta.

Metabolix [29.11.2019 11:06:38]

#

Kannattaa käyttää apumuuttujia toiston välttämiseen ja ryhmitellä koodi järkevämmin. Esimerkiksi tuo do-while-silmukka menisi luontevammin niin, että silmukassa vietäisiin indeksiä ylöspäin ja oikean merkin löytyminen olisi silmukan sisällä lopetusehtona. Merkin tunnistamisen voi lyhentää niin, että laittaa hyväksyttävät merkit merkkijonoksi ja tutkii indexOf-metodilla, löytyykö merkki sieltä.

Tuon vokaalin haun voisi tehdä todella paljon helpommin esimerkiksi näin:

// Kierroksia on enintään merkkijonon pituuden verran.
for (int i = 0; i < mjn.length(); ++i) {
  // Siirrytään seuraavaan indeksiin. Jakojäännöksellä päästään lopusta alkuun.
  indeksi = (indeksi + 1) % mjn.length();
  // Tutkitaan tätä merkkiä. Jos on vokaali, näytetään ja lopetetaan silmukka.
  final char merkki = mjn.charAt(indeksi);
  if ("aeiouyåäö".indexOf(merkki) > -1) {
    teksti.setText(String.valueOf(merkki));
    break;
  }
}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta