* Изподен код от упражнение 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 е по-бърз.
Добави коментар