Hei
Olen pähkäillyt miten tarkastetaan anagrammit kahdesta annetusta sanasta.
Alla koodi, mutta jotain häikkää siinä on.
import java.util.*; public class Anagrammi { public static boolean onkoAnagrammi(String lause1, String lause2) { if (lause1.length() != lause2.length()) return false; int [] taulukko = new int[50]; int a = 0; int b = 0; char[] apu = lause1.toCharArray(); for (char c : apu) { if (taulukko[c] == 0) a++; { ++taulukko[c]; } } for (int i = 0; i < lause2.length(); i++) { int c = (int) lause2.charAt(i); if(taulukko[c] == 0) { return false; } --taulukko[c]; if (taulukko[c] == 0) { ++b; if (b == a) { return i == lause2.length() - 1; } } } return false; } public static void main(String[] args) { Scanner lukija = new Scanner(System.in); System.out.println("Ohjelma kysyy 2 merkkijonoa ja tarkastaa onko ne anagrammeja keskenään: "); System.out.println("Anna ensimmäinen merkkijono: "); String lause1 = lukija.next(); System.out.println("Anna toinen merkkijono: "); String lause2 = lukija.next(); boolean tulos = onkoAnagrammi(lause1, lause2); if (tulos == true) { System.out.println("Antamistasi merkkijonoistaterve löytyi anagrammi: "); } else { System.out.println("Merkkijonoista ei löytynyt anagrammia: "); } } }
Jos molempiin merkkijonoihin laittaa yhtäpaljon merkkejä tulee alla oleva virheilmoitus.Muutoin tulostuu ettei anagrammeja löytynyt. Enkä tajua mikä on vikana
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 104
at Anagrammi.onkoAnagrammi(Anagrammi.java:14)
at Anagrammi.main(Anagrammi.java:48)
Taulukossa, johon tallennat eri merkkien määrät, on vain 50 kohtaa, mutta esimerkiksi a-kirjaimen arvo on 97. Taulukkoa pitää suurentaa todella paljon, jos haluat, että kaikki mahdolliset merkkijonot toimivat. Lisäksi ensimmäisen for-silmukan sisällä olevassa if-lause on todella kummallisesti kirjoitettu vaikka toiminta onkin oikea.
Et tarvitse ollenkaan muuttujia a ja b, koska sinulla on jo alussa tarkistus, että merkkijonot ovat yhtä pitkät. Riittää, että ensimmäisen sanan kohdalla korotat taulukon kohtia (for-silmukassa ilman mitään if-lausetta) ja toisen kohdalla alennat. Jos jossain kohdassa alennus vie alle nollan, sana ei ole anagrammi, muuten on.
Toinen kiinnostava lähestymistapa olisi, että muuttaisit tekstit taulukoiksi, järjestäisit taulukot (Arrays.sort) ja vertailisit niitä (Arrays.equals).
Kolmas mahdollisuus on kiertää for-silmukalla kaikki merkit ja sen sisällä uudestaan for-silmukoilla laskea kyseisen merkin määrä kummassakin merkkijonossa. Näin merkkien määriä ei tarvitse tallentaa taulukkoon.
Kiitos, nostin merkkienmäärän 50:stä 300:n ja ohjelma rupesi toimimaan.
Käyn vielä läpi muutkin antamasi vaihtoehdot.
Aihe on jo aika vanha, joten et voi enää vastata siihen.