Answers Java Advanced Features
Answers Java Advanced Features
Task 1
class Point2D {
protected float x, y;
public Point2D() {
@Override
public String toString() {
return String.format("(%f,%f)", x, y);
}
}
@Override
public String toString() {
return String.format("(%f,%f,%f)", x, y, z);
}
}
Task 2
class Person {
protected String name, address;
public Person() {
@Override
public String toString() {
return String.format("%s->%s", name, address);
}
}
class Student extends Person {
private String typeOfStudies;
private int yearOfStudy;
private float studiesPrice;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
", typeOfStudies='" + typeOfStudies + '\'' +
", yearOfStudy='" + yearOfStudy + '\'' +
", studiesPrice=" + studiesPrice +
'}';
}
}
class Staff extends Person {
private String specialization;
private float salary;
@Override
public String toString() {
return "Staff{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
", specialization='" + specialization + '\'' +
", salary='" + salary + '\'' +
'}';
}
}
Task 3
public class Exercise3 {
class Shape {
private String color;
private boolean isFilled;
public Shape() {
this.color = "unknown";
this.isFilled = false;
}
@Override
public String toString() {
return String.format("Shape with color of %s and %s",
color, isFilled ? "filled" : "NotFilled");
}
}
@Override
public String toString() {
return String.format("Circle with radius=%f which is
subclass off %s", radius, super.toString());
}
}
@Override
public String toString() {
return String.format("Rectangle with width=%f and
length=%f which is subclass off %s", width, length,
super.toString());
}
}
@Override
public void setWidth(double width) {
super.setWidth(width);
super.setLength(width);
}
@Override
public void setLength(double length) {
super.setWidth(width);
super.setLength(length);
}
@Override
public String toString() {
return String.format("Square with width=%f and length=%f
which is subclass off %s", width, length, super.toString());
}
}
Task 4
public class Exercise4 {
public ShapeEx4() {
this.color = "unknown";
this.isFilled = false;
}
@Override
public String toString() {
return String.format("Shape with color of %s and %s",
color, isFilled ? "filled" : "NotFilled");
}
}
@Override
public float getArea() {
return (float) (Math.PI * radius * radius);
}
@Override
public float getPerimeter() {
return (float) (2 * Math.PI * radius);
}
@Override
public String toString() {
return String.format("Circle with radius=%f which is
subclass off %s", radius, super.toString());
}
}
@Override
public float getArea() {
return (float) (width * length);
}
@Override
public float getPerimeter() {
return (float) (2 * width + 2 * length);
}
@Override
public String toString() {
return String.format("Rectangle with width=%f and
length=%f which is subclass off %s", width, length,
super.toString());
}
}
@Override
public void setWidth(double width) {
super.setWidth(width);
super.setLength(width);
}
@Override
public void setLength(double length) {
super.setWidth(width);
super.setLength(length);
}
@Override
public String toString() {
return String.format("Square with width=%f and length=%f
which is subclass off %s", width, length, super.toString());
}
}
Task 5
public class Exercise5 {
class Line {
class Point2DExt {
protected float x, y;
public Point2DExt() {
@Override
public String toString() {
return String.format("(%f,%f)", x, y);
}
}
Task 6
public class Exercise6 {
interface Movable {
void moveUp();
void moveDown();
void moveLeft();
void moveRight();
}
private int x, y;
private int xSpeed, ySpeed;
@Override
public void moveUp() {
y += ySpeed;
}
@Override
public void moveDown() {
y -= ySpeed;
}
@Override
public void moveLeft() {
x -= xSpeed;
}
@Override
public void moveRight() {
x += xSpeed;
}
@Override
public String toString() {
return "MovablePoint{" +
"x=" + x +
", y=" + y +
", xSpeed=" + xSpeed +
", ySpeed=" + ySpeed +
'}';
}
}
@Override
public void moveUp() {
movablePoint.moveUp();
}
@Override
public void moveDown() {
movablePoint.moveDown();
}
@Override
public void moveLeft() {
movablePoint.moveLeft();
}
@Override
public void moveRight() {
movablePoint.moveRight();
}
@Override
public String toString() {
return "MovableCircle{" +
"radius=" + radius +
", movablePoint=" + movablePoint +
'}';
}
}
Task 7
public class Exercise7 {
interface GeometricObject {
double getPerimeter();
double getArea();
}
interface Resizable {
void resize(int percent);
}
@Override
public double getPerimeter() {
return 2 * Math.PI * radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
@Override
public String toString() {
return "CircleGeometricObject{" +
"radius=" + radius +
'}';
}
}
@Override
public void resize(int percent) {
radius = radius * percent / 100;
}
@Override
public String toString() {
return "ResizableCircle{" +
"radius=" + radius +
'}';
}
}
Exceptions - answers
Task 1
class MathUtils {
Task 2
public class Exercise2 {
class Book {
private String title;
private String author;
private String isbn;
@Override
public String toString() {
return "Book{" +
"title='" + title + '\'' +
", author='" + author + '\'' +
", isbn=" + isbn +
'}';
}
}
class BookRepository {
Task 1
class UserValidator {
public String[] validateEmails(String email, String
alternativeEmail) {
class Email {
private String email;
Task 2
public class Exercise2 {
public static void main(String[] args) {
Movie movie = new Movie.MovieCreator()
.setTitle("Star Wars")
.setDirector("J.J Abrams")
.setGenre("Action")
.setYearOfRelease(2015)
.setPublisher("Disney")
.createMovie();
System.out.println(movie);
}
}
class Movie {
private String title;
private String director;
private int yearOfRelease;
private String genre;
private String publisher;
@Override
public String toString() {
return "Movie{" +
"title='" + title + '\'' +
", director='" + director + '\'' +
", yearOfRelease='" + yearOfRelease + '\'' +
", genre='" + genre + '\'' +
", publisher='" + publisher + '\'' +
'}';
}
Task 3
public class Exercise3 {
class Car {
private String name;
private String type;
private Engine engine;
public Car(String name, String type) {
this.name = name;
this.type = type;
engine = new Car.Engine();
engine.setEngineType(type);
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", type='" + type + '\'' +
", engine=" + engine +
'}';
}
class Engine {
private String engineType;
@Override
public String toString() {
return "Engine{" +
"engineType='" + engineType + '\'' +
'}';
}
}
}
Task 4
public class Exercise4 {
interface Validator<T> {
boolean validate(T input);
}
class User {
private String name;
private String lastName;
private int age;
private String login;
private String password;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", lastName='" + lastName + '\'' +
", age=" + age +
", login='" + login + '\'' +
", password='" + password + '\'' +
'}';
}
}
Enumerated types - answers
Task 1
enum Weekday {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY,
SUNDAY;
boolean isWeekDay() {
return this != SATURDAY && this != SUNDAY;
}
boolean isHoliday() {
return this == SATURDAY || this == SUNDAY;
}
Task 2
public class Exercise2 {
public static void main(String[] args) {
PackageSize packageSize = PackageSize.getPackageSize(41,
60);
System.out.println(packageSize);
}
}
enum PackageSize {
SMALL(40, 90),
MEDIUM(90, 140),
LARGE(140, 250),
UNKNOWN(0, 0);
Task 3
public class Exercise3 {
interface Converter {
float convert(float tempIn);
}
enum TemperatureConverter {
C_F('C', 'F', new Converter() {
@Override
public float convert(float tempIn) {
return (tempIn * 9 / 5) + 32;
}
}),
C_K('C', 'K', new Converter() {
@Override
public float convert(float tempIn) {
return tempIn + 273.15f;
}
}),
K_C('K', 'C', new Converter() {
@Override
public float convert(float tempIn) {
return tempIn - 273.15f;
}
}),
F_C('F', 'C', new Converter() {
@Override
public float convert(float tempIn) {
return (tempIn - 32) * 5 / 9;
}
}),
F_K('F', 'K', new Converter() {
@Override
public float convert(float tempIn) {
return (tempIn - 32f) * 5 / 9 + 273.15f;
}
}),
K_F('K', 'F', new Converter() {
@Override
public float convert(float tempIn) {
return (tempIn + 273.15f) * 9 / 5 + 32;
}
});
Task 1
class SDAArrayList<E> {
public SDAArrayList() {
elementArray = new Object[INITIAL_CAPACITY];
}
Task 2
public class Exercise2 {
System.out.println(bookService.findByAuthor(author2));
System.out.println(bookService.getAll());
System.out.println(bookService.findMostExpensiveBook());
System.out.println(bookService.sortByTitleAsc());
System.out.println(bookService.sortByTitleDsc());
}
}
class Author {
private String name;
private String lastName;
private char gender;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Author author = (Author) o;
return gender == author.gender &&
Objects.equals(name, author.name) &&
Objects.equals(lastName, author.lastName);
}
@Override
public int hashCode() {
return Objects.hash(name, lastName, gender);
}
@Override
public String toString() {
return "Author{" +
"name='" + name + '\'' +
", lastName='" + lastName + '\'' +
", gender=" + gender +
'}';
}
}
enum Genre {
ACTION, FANTASY, CRIME
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book book = (Book) o;
return Float.compare(book.price, price) == 0 &&
yearOfRelease == book.yearOfRelease &&
Objects.equals(title, book.title) &&
Objects.equals(authors, book.authors) &&
genre == book.genre;
}
@Override
public int hashCode() {
return Objects.hash(title, price, yearOfRelease, authors,
genre);
}
@Override
public int compareTo(Book o) {
return o.getTitle().compareTo(title);
}
@Override
public String toString() {
return "Book{" +
"title='" + title + '\'' +
", price=" + price +
", yearOfRelease=" + yearOfRelease +
", authors=" + authors +
", genre=" + genre +
'}';
}
}
class BookService {
private List<Book> books = new ArrayList<>();
Task 3
public class Exercise3 {
System.out.println(bookService.mapBooks());
}
}
class BookServiceExt {
private List<Book> books = new ArrayList<>();
}
Task 5
class BookServiceExt2 {
private List<Book> books = new ArrayList<>();
}
Functional programming - answers
Task 1
//list of episodes
List<Episode> episodes = seasons.stream()
.flatMap(s -> season.episodes.stream())
.collect(Collectors.toList());
//list of videos
List<Video> videos = seasons.stream()
.flatMap(s -> season.episodes.stream())
.flatMap(e -> e.videos.stream())
.collect(Collectors.toList());
enum VideoType {
CLIP, PREVIEW, EPISODE
}
class Video {
public String title;
public String url;
public VideoType videoType;
@Override
public String toString() {
return "Video{" +
"title='" + title + '\'' +
", url='" + url + '\'' +
", videoType=" + videoType +
'}';
}
}
class Episode {
public String episodeName;
public int episodeNumber;
List<Video> videos;
@Override
public String toString() {
return "Episode{" +
"episodeName='" + episodeName + '\'' +
", episodeNumber=" + episodeNumber +
", videos=" + videos +
'}';
}
}
class Season {
public String seasonName;
public int seasonNumber;
List<Episode> episodes;
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonNumber=" + seasonNumber +
", episodes=" + episodes +
'}';
}
}
Generic types - answers
Task 1
public K getKey() {
return key;
}
public V getValue() {
return value;
}
@Override
public String toString() {
return "Pair{" +
"key=" + key +
", value=" + value +
'}';
}
}
Task 2
public class Exercise2 {
interface Validator<T> {
boolean validate(T value);
}
class Utils {
public static <T> int countIf(T[] tab, Validator<T> validator)
{
int counter = 0;
for (T element : tab) {
if (validator.validate(element)) {
counter++;
}
}
return counter;
}
}
Task 3
public class Exercise3 {
public static void main(String[] args) {
Integer[] tab = {10, 21, 33, 40, 50, 60};
ArrayUtils.swap(tab, 2, 5);
System.out.println(Arrays.toString(tab));
}
}
class ArrayUtils {
public static <T> void swap(T[] array, int index1, int index2)
{
T tmp = array[index1];
array[index1] = array[index2];
array[index2] = tmp;
}
}
Task 4
public class Exercise4 {
System.out.println(Arrays.toString(bookLibrary.getElements()));
System.out.println(Arrays.toString(movieLibrary.getElements()));
System.out.println(Arrays.toString(newspaperLibrary.getElements()));
}
}
@Override
public String toString() {
return "Book{" +
"title='" + title + '\'' +
", author='" + author + '\'' +
'}';
}
}
@Override
public String toString() {
return "Newspaper{" +
"title='" + title + '\'' +
", editor='" + editor + '\'' +
'}';
}
}
@Override
public String toString() {
return "Movie{" +
"title='" + title + '\'' +
", director='" + director + '\'' +
'}';
}
}
Task 5
public class Exercise5 {
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", favoriteFood='" + favoriteFood + '\'' +
'}';
}
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", numberOfLife=" + numberOfLife +
'}';
}
}
T[] animals;
Task 1
Task 2
public class Exercise2 {
Task 4
public class Exercise4 {
}
return longestWord;
}
}
Task 5
public class Exercise5 {
public static void main(String[] args) throws IOException {
UserParser userParser = new UserParser();
Path path =
Paths.get("/Users/sdauser/Documents/sda/code/test.txt");
List<User> users = new ArrayList<>();
List<String> lines = Files.readAllLines(path);
for (String line : lines) {
User user = userParser.fromCSV(line);
users.add(user);
}
System.out.println("Results " + users);
}
}
class UserParser {
public User fromCSV(String csvLine) {
String[] data = csvLine.split(",");
return new User(data[0], data[1],
Integer.parseInt(data[2]));
}
}
class User {
private String name;
private String lastName;
private int age;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", lastName='" + lastName + '\'' +
", age=" + age +
'}';
}
}
Task 6
public class Exercise6 {
class MovieFileRepository {
class MovieParser {
private static final String SEPARATOR = ",";
@Override
public String toString() {
return "Movie{" +
"title='" + title + '\'' +
", genre='" + genre + '\'' +
", director='" + director + '\'' +
", yearOfRelease=" + yearOfRelease +
'}';
}
}
Parallel and concurrent programming -
answers
Task 1
public class Exercise1 {
thread1.start();
thread2.start();
}
Task 2
public class Exercise2 {
class Car {
private String name;
private String type;
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", type='" + type + '\'' +
'}';
}
}
class Bridge {
Task 3
public class Exercise3 {
public static void main(String[] args) throws
InterruptedException, ExecutionException {
Random random = new Random();
int[] array1 = new int[10000];
int[] array2 = new int[10000];
for (int i = 0; i < 10000; i++) {
array1[i] = random.nextInt(20000);
array2[i] = array1[i];
}
ExecutorService executorService =
Executors.newFixedThreadPool(2);
String result = executorService.invokeAny(Arrays.asList(
new BubbleSortStrategy(array1),
new InsertionSortStrategy(array2)
));
System.out.println(result);
executorService.shutdown();
}
}
@Override
public String call() throws Exception {
bubbleSort();
return "Bubble sort";
}
}
@Override
public String call() throws Exception {
insertionSort();
return "Insertion sort";
}
}
Task 4
public class Exercise4 {
thread1.start();
thread2.start();
thread3.start();
}
}
class Account {
Task 5
public class Exercise5 {
class Iterator<T> {
public T next() {
if (atomicInteger.get() < data.length) {
return data[atomicInteger.getAndIncrement()];
}
throw new IllegalArgumentException("Out of range!");
}
public T prev() {
if (atomicInteger.get() > 0 && atomicInteger.get() <
data.length) {
return data[atomicInteger.getAndDecrement()];
}
throw new IllegalArgumentException("Out of range!");
}
}
Re ection API basics - answers
Task 1
System.out.println("Methods: ");
Method[] methods =
student.getClass().getDeclaredMethods();
System.out.println(Arrays.toString(methods));
System.out.println("Fields: ");
Field[] fields = student.getClass().getDeclaredFields();
System.out.println(Arrays.toString(fields));
System.out.println("Constructors: ");
Constructor[] constructors =
student.getClass().getConstructors();
System.out.println(Arrays.asList(constructors));
}
}
class Student {
private String name;
private String lastName;
private int index;
private String typeOfStudies;
public Student() {
Task 2
public class Exercise2 {
Field nameField =
studentExt.getClass().getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(studentExt, "Johnson");
Field lastNameField =
studentExt.getClass().getDeclaredField("lastName");
lastNameField.setAccessible(true);
lastNameField.set(studentExt, "Spring");
System.out.println(typeOfStudies);
class StudentExt {
private String name;
private String lastName;
private int index;
private String typeOfStudies;
public StudentExt() {
@Override
public String toString() {
return "StudentExt{" +
"name='" + name + '\'' +
", lastName='" + lastName + '\'' +
", index=" + index +
", typeOfStudies='" + typeOfStudies + '\'' +
'}';
}
}