Tämä ohjelma etsii merkkijonosta vokaalit. Kun ollaan merkkijonon lopussa, aloitetaan alusta.
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; } } } }
Tämä koodi on niin surkea räpellys, että pakko olla spammitrollausta.
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; } }
Aihe on jo aika vanha, joten et voi enää vastata siihen.