* Задача от контролно 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 ?
По-правилно е, но не прави никаква разлика. Просто е една празна итерация повече.