* Изподен код от упражнение 7, 2015
Публикувано на 06 ноември 2015 в раздел ПИК3 Java.
Задача 1. Реализирайте клас Author (автор). В него член-променливи са имена (name от тип String), държава (country от тип String) и телефонен номер (phone от тип String). Направете само конструктор с подадени параметри. Променливите name и country направете само за четене, а phone направете така, че да може да се чете и променя. За phone се погрижете да е записан в следния формат: xxx-xxx-xxxx (например 567-123-8888 e валиден телефон). Предвидете допълнителна възможност да бъде въведен телефон и в алтернативни два формата – xxxxxxxxxxx (например 5671238888) или (xxx) xxx-xxxx (например (567) 123-8888). Ако в set метода се подаде телефон в алтернативен формат, вие трябва да го конвертирате до стандартния и да го запишете в него.
Задача 2. Реализирайте клас Poem (стихотворениe). В него член-променливи са заглавие (title от тип String), съдържание (content от тип String) и автор (author от тип Authors). Направете само конструктор с подадени параметри. Не правете get и set методи. Направете статичен клас “boolean comparePoems(Poem p1, Poem p2)” (сравни стихотворения), в който се извършват следните действия:
- В два обекта от тип StringBuilder се натрупват всички английски букви и цифри от двете стихотворения. Пропускат се всякакви други специални символи, дори интервали. Всички главни букви се натрупват превърнати в малки букви;
- Проверява се дали така обработените низове са едни и същи – ако да, метода връща true, иначе връща false.
Реализирайте нестатична версия на предишния метод – boolean compare(Poem p)
Демонстрирайте функционалностите от програмата в клас с main метод
Решение: Тук използваме т.нар. "неприхващаеми групи" за регулярния израз. Знаете, че когато оградите нещо в скоби - например ([a-z]) за малки букви - после можете да го използвате чрез .group(i) метода на Matcher, където i е индекса на въпросната група. Ако след отварящата скоба на дадена група поставите символите "?:", вие ще укажете, че тази група няма да получи индекс и ще бъде пропусната.
import java.util.*; import java.util.regex.*; public class PoemsExample{ public static void main(String[] args){ try{ Author a = new Author("Ivan", "Bulgaria", "(888) 999-1111"); System.out.println(a.getPhone()); Poem p1 = new Poem("ABCD", "aaAA $*@ fa@sfsad 00312321 #$@$@#fffff", a); Poem p2 = new Poem("DEFG", "aaAA fasfsad 00@@#312321 #$@$@#fffff", a); System.out.println(Poem.comparePoems(p1, p2)); System.out.println(p1.compare(p2)); } catch(PhoneFormatException e){ System.out.println(e.getMessage()); } } } class PhoneFormatException extends Exception{ private static String defaultMsg = "Invalid phone format"; PhoneFormatException(){ super(defaultMsg); } PhoneFormatException(String phone){ super(defaultMsg+": "+phone); } } class Author{ private String name; private String country; private String phone; Author(String name, String country, String phone) throws PhoneFormatException{ this.name=name; this.country=country; this.setPhone(phone); } String getName(){ return this.name; } String getCountry(){ return this.country; } String getPhone(){ return this.phone; } void setPhone(String phone) throws PhoneFormatException{ String ptrn = "^(?:([0-9]{3})([0-9]{3})([0-9]{4}))|"; ptrn += "(?:([0-9]{3})[\\-]([0-9]{3})[\\-]([0-9]{4}))|"; ptrn += "(?:[\\(]([0-9]{3})[\\)][ ]([0-9]{3})[\\-]([0-9]{4}))$"; Pattern p = Pattern.compile(ptrn); Matcher m = p.matcher(phone); if(m.matches()){ if(m.group(1)!=null) this.phone=m.group(1)+"-"+m.group(2)+"-"+m.group(3); else if(m.group(4)!=null) this.phone=m.group(4)+"-"+m.group(5)+"-"+m.group(6); else this.phone=m.group(7)+"-"+m.group(8)+"-"+m.group(9); return; } else throw new PhoneFormatException(phone); } } class Poem{ String title; String content; Author author; Poem(String title, String content, Author author){ this.title=title; this.content=content; this.author=author; } boolean compare(Poem p){ return Poem.comparePoems(this, p); } static boolean comparePoems(Poem p1, Poem p2){ String strp1 = stripPoemContents(p1.content); String strp2 = regexStripPoemContents(p2.content); if(strp1.equals(strp2)) return true; else return false; } private static String stripPoemContents(String content){ StringBuilder strb = new StringBuilder(content.length()); content=content.toLowerCase(); for(int i=0; i<content.length(); i++){ if((content.charAt(i)>='a' && content.charAt(i)<='z') || (content.charAt(i)>='0' && content.charAt(i)<='9')){ strb.append(content.charAt(i)); } } return strb.toString(); } // Alternative solution with regex private static String regexStripPoemContents(String content){ StringBuilder strb = new StringBuilder(content.length()); Pattern p = Pattern.compile("[a-zA-Z0-9]+"); Matcher m = p.matcher(content); while(m.find()){ strb.append(m.group().toLowerCase()); } return strb.toString(); } }
Допълнителна задача: генерирайте огромен текстови файл и тествайте кой от двата метода stripPoemContents и regexStripPoemContents е по-бърз.
Добави коментар