* Задача от контролно 1, вариант 2, 22 ноември 2014 г.
Публикувано на 22 ноември 2014 в раздел ПИК3 Java.
Задача 1. Създайте клас за филми (Movie) с член променливи име (name – тип String), времетраене в секунди (length - int) и трейлър (trailer - FileInputStream). Минималният брой на секундите в един филм трябва да e 3600. Създайте само един конструктор - с подадени параметри.
Задача 2. В клас Movie добавете следните методи:
a) static boolean equalTrailers(FileInputStream movie1, FileInputStream movie2) – методът трябва да сравни двата файла байт по байт и да върне true ако двата подадени трейлъра са с еднакво съдържание или false ако са различни;
b) static int compareMovieLenghts(Movie m1, Movie m2) – връща -1 ако m1 е с по-голяма продължителност от m2, 0 ако са равни по продължителност или 1 ако m2 е по-дълъг от m1.
c) Int compareWith(Movie m) – сравнява текущия обект (филм) с друг подаден като параметър на същия принцип, както е сравнение в подточка b)
Задача 3. Напишете клас LongMovie, който наследява Movie и добавя изискването времетраенето на филма да е минимум 10800 секунди.
Задача 4. Напишете клас с main метод, в който извършете следните действия:
a) Използвайки полиморфизъм създайте масив от 3 елемента, в който добавете два Movie и един LongMovie;
b) Проверете дали измежду въведените филми има такива, които да са с дублиращи се трейлъри – изведете имената на повтарящите се филми по двойки в конзолата (не забравяйте, че е възможно един филм да се повтаря повече от веднъж – тогава трябва да изведете всички комбинации от повторения). Задължително е да се реализира чрез цикъл/и обхождащ/и масива;
c) Изведете имената на филмите подредени по следния принцип:
a. Филмите с по-дълго времетраене, трябва да излезнат по-напред в списъка;
b. Тези с равно времетраене ги подредете по азбучен ред
Решение: Изтеглете като сорс код (или четете по-надолу):
import java.io.*; import java.util.*; public class Kontrolno1{ public static void main(String[] args){ Movie[] list = new Movie[3]; try{ list[0] = new Movie("ZZZ 1", 15000, new FileInputStream("ZAD1.docx")); list[1] = new LongMovie("Test 2", 5000, new FileInputStream("ZAD2.docx")); list[2] = new Movie("Test 3", 5000, new FileInputStream("ZAD3.docx")); } catch(Exception e){ System.err.println(e.getMessage()); } for(int i=0; i<list.length; i++){ for(int j=i+1; j<list.length; j++){ try{ if(Movie.equalTrailers(list[i].trailer, list[j].trailer)){ System.out.println(list[i].name +" and "+list[j].name+ " are equal"); } } catch(IOException e){ System.err.println(e.getMessage()); } } } Comparator<Movie> cmp = new Comparator<Movie>(){ public int compare(Movie m1, Movie m2) { // да връща <0 ако m1 е преди m2, 0 ако са еднакви и >0 ако m2 е преди m1 int lengthsComparison = Movie.compareMovieLengths(m1, m2); if(lengthsComparison!=0) return lengthsComparison; else return m1.name.compareTo(m2.name); } }; Arrays.sort(list, cmp); for(Movie m: list){ System.out.println(m.name); } } } class Movie{ String name; private int length; FileInputStream trailer; public Movie(String name, int length, FileInputStream trailer) throws Exception{ this.name = name; this.setLength(length); this.trailer = trailer; } int getLength(){ return this.length; } void setLength(int length) throws Exception{ if(length<3600) throw new Exception("Movie is too short"); else this.length = length; } static boolean equalTrailers(FileInputStream m1, FileInputStream m2) throws IOException{ if(m1.equals(m2)) return true; BufferedInputStream input1 = new BufferedInputStream(m1); BufferedInputStream input2 = new BufferedInputStream(m2); int ch1=-1, ch2=-1; while ((ch1 = input1.read())!=-1){ ch2 = input2.read(); if (ch1 != ch2){ try{ if(input1 != null) input1.close(); if(input2 != null) input2.close(); } catch(IOException e){} return false; } try{ if(input1 != null) input1.close(); if(input2 != null) input2.close(); } catch(IOException e){} return true; } static int compareMovieLengths(Movie m1, Movie m2){ if(m1.getLength() > m2.getLength()) return -1; if(m1.getLength() < m2.getLength()) return 1; return 0; } int compareWith(Movie m){ return Movie.compareMovieLengths(this, m); } } class LongMovie extends Movie{ public LongMovie(String name, int length, FileInputStream trailer) throws Exception{ super(name, length, trailer); this.setLength(length); } void setLength(int length) throws Exception{ if(length<10800 ) throw new Exception("This is not a long movie"); else super.setLength(length); } }
Не трябва ли единия от филмите да е обект от тип LongMovie, т.е.
list[0] = new Movie("ZZZ 1", 15000, new FileInputStream("ZAD1.docx"));
да е
list[0] = new LongMovie("ZZZ 1", 15000, new FileInputStream("ZAD1.docx"));
Да, трябва. Поправих го в примера.
for(int i=0; i<list.length; i++){
for(int j=i+1; j<list.length; j++){
.....
първия цикъл не трябва ли да е до i<list.length-1 ?
По-правилно е, но не прави никаква разлика. Просто е една празна итерация повече.