C, PHP, VB, .NET

Дневникът на Филип Петров


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

 



Добави коментар

Адресът на електронната поща няма да се публикува


*