Gyakorlati alapok III.
Palindróma osztályszinten
Nem túl izgalmas, de azért tanulságos története van ezen fejezetnek. A palindróma megoldását adtam fel egyik tanítványomnak, de már osztályszintű megvalósításban (alapfejezete a Palindróma). A megoldás kiválóra sikerült, ám időközben már én is annyit foglalkoztam a problémával, hogy "kénytelen" voltam megalkotni saját verziómat. Ez 5 osztályból áll:
-
Controller
-
Input
-
Messages
-
Test
-
Validation
Controller
Ez az osztály tartalmazza a main() főprogramot és egyfajta lefuttató-kontrolláló funkciót lát el (A Controller osztály lehetősége című fejezet). A cél itt, hogy lehetőség szerint az összes (külső) osztályhivatkozás 1 helyen legyen.
Input
Ezen osztálynak csupán 1 funkciója van: bekérje a palindróma megállapításához szükséges szöveget. Kimeneti típusa string.
Messages
Ezen osztály csakis a működés közben keletkező üzeneteket tartalmazza. Típusuk szerint egyszerű szöveges eljárások (Külön (nem rendőrségi) eljárás című fejezet).
Test
Ezen osztálynak egyetlen funkciója van: tesztelni, hogy a bemeneti string palindróma-e vagy sem, ezért kimeneti típusa kétállású boolean.
Validation
Ezen osztály ellenőrzi (validálja), hogy a bemeneti string megfelelő-e a palindróma vizsgálatához. Itt többféle szempont is felállítható, egyúttal remek einsteini gondolatkísérlet annak meghatározására, hogy milyen hibákat véthet a bemeneti string-et begépelő buta (vagy gonoszkodó) felhasználó. Én az alábbi szempontokat választottam. Hibaüzenet, ha:
-
nem gépel be semmit,
-
minden olyan betű vagy karakter, amely nem része az angol ABC nagy-, vagy kisbetűinek,
-
egyúttal számok sem engedettek.
Mivel a projekt oktatási célból készült, a legfontosabb kommenteket is bennehagytam (Kommentelés című fejezet), például:
//Checking
//System.out.println(validation.isValidAll(validation.isValidNotEmpty(inputString),
Nézzük meg a futtatható Java-kódot:
Controller.java
public class Controller {
public static void main(String[]args) {
Messages messages = new Messages();
Input input = new Input();
String inputString = "";
Validation validation = new Validation();
do {
messages.messageGreetings();
inputString = input.inputString();
if(validation.isValidNotEmpty(inputString) == false) {
messages.messageIsEmpty();
//System.out.println(validation.isValidNotEmpty(inputString));
continue;
}
if(validation.isValidChars(inputString) == false) {
messages.messageNOTProperChar();
//System.out.println(validation.isValidChars(inputString));
continue;
}
}while(validation.isValidAll(validation.isValidNotEmpty(inputString),
validation.isValidChars(inputString)) == false);
//Checking
//System.out.println(validation.isValidAll(validation.isValidNotEmpty(inputString),
validation.isValidChars(inputString)));
Test test = new Test();
if(test.testPalindrome(inputString) == true) {
messages.messageIsPalindrome();
}
else
messages.messageIsNOTPalindrome();
}
}
Input.java
import java.util.Scanner;
public class Input {
public static String inputString() {
String input = "";
Scanner scanner = new Scanner(System.in);
input = scanner.nextLine();
//Alapertelmezesben le kell zarni, de nem most
//scanner.close();
return input;
}
}
Messages.java
class Messages {
void messageGreetings() {
System.out.println ("Kerem, hogy adja meg a vizsgalando
szoveget!");
}
void messageNOTProperChar() {
System.out.println ("Nem megfelelo karakter(ek)!");
}
void messageIsEmpty() {
System.out.println ("Kerem, hogy irjon be valamit!");
}
void messageIsPalindrome() {
System.out.println ("A bevitt szoveg palindroma!");
}
void messageIsNOTPalindrome() {
System.out.println ("A bevitt szoveg NEM palindroma!");
}
}
Test.java
public class Test {
public boolean testPalindrome(String input) {
String inputTemp = input.toLowerCase().replaceAll("\\s", "");
boolean isPalindrome = false;
StringBuffer reversedString = new
StringBuffer(inputTemp).reverse();
//Checking
//System.out.println(inputTemp);
//System.out.println(reversedString);
if(inputTemp.equals(reversedString.toString())) {
isPalindrome = true;
return isPalindrome;
}
return isPalindrome;
}
}
Validation.java
public class Validation {
boolean isValidNotEmpty(String input) {
boolean valid = false;
if(input.isEmpty()) {
return valid;
}
valid = true;
return valid;
}
boolean isValidChars(String input) {
boolean valid = false;
char [] arrayChars = new char[]
{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','X','Y','V','W','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','x','y','v','w','z','
'};
char[] inputArray = input.toCharArray();
//ellenorzo tomb
boolean [] check = new boolean[input.length()];
//A biztonsag kedveert
for(int i = 0; i < check.length; i++) {
check[i] = false;
}
//Minden elemet minden elemmel
for(int i = 0; i < inputArray.length; i++) {
for(int j = 0; j < arrayChars.length;
j++) {
if(inputArray[i] == arrayChars[j]) {
check[i] = true;
continue;
}
}
}
//Ha 1 db false is van, tovabb mar nem erdemes vizsgalni ->
return
for(int i = 0; i < check.length; i++) {
if(check[i] == false) {
return valid;
}
}
valid = true;
return valid;
}
boolean isValidAll(boolean notEmpty, boolean charsOK) {
boolean valid = false;
if(notEmpty && charsOK == true) {
valid = true;
return valid;
}
return valid;
}
}
Végeredmény:
Kerem, hogy adja meg a vizsgalando szoveget!
Kerem, hogy irjon be valamit!
Kerem, hogy adja meg a vizsgalando szoveget!
123
Nem megfelelo karakter(ek)!
Kerem, hogy adja meg a vizsgalando szoveget!
geza kek az eg
A bevitt szoveg palindroma!