Problem 1:
import java.util.Iterator;
interface Work<T> extends Iterable<T> {
boolean noWork();
Work<T> addwork(T x);
T viewWork();
Work<T> removeWork();
Work<T> reverse();
default Iterator<T> iterator() {
return new WorkIterator<T>(this);
class WorkIterator<T> implements Iterator<T> {
private Work<T> l;
public WorkIterator(Work<T> l) {
this.l = l;
public boolean hasNext() {
return !l.noWork();
public T next() {
T result = l.viewWork();
l = l.removeWork();
return result;
}
}
class NoWork<T> implements Work<T> {
public NoWork() { }
public boolean noWork() {
return true;
public T viewWork() {
throw new RuntimeException("No work!");
public Work<T> removeWork() {
throw new RuntimeException("No work!");
public Work<T> addwork(T x) {
return new SomeWork<T> (x,this);
public Work<T> reverse() {
return new NoWork<T>();
class SomeWork<T> implements Work<T> {
public T data;
public Work<T> next;
public SomeWork(T x, Work<T> l) {
data = x; next = l;
public boolean noWork() {
return false;
public T viewWork() {
return this.data;
public Work<T> removeWork() {
return this.next;
public Work<T> addwork(T x) {
return new SomeWork<T> (x,this);
public Work<T> reverse() {
Work<T> result = new NoWork<T>();
for(T t: this) result = new SomeWork<T>(t,result);
return result;
public class Doit {
public static void main(String[] arr) {
Work<String> work = new NoWork<>();
for(String s: arr) work = work.addwork(s);
for(String s: work.reverse()) System.out.println(s);
}
Problem 2:
import java.util.*;
class LibraryItem {
private static int nextId = 1;
private final int id;
private final String title;
private boolean available;
public LibraryItem(String title) {
this.id = nextId++;
this.title = title;
this.available = true;
public int getId() {
return id;
public String getTitle() {
return title;
public boolean isAvailable() {
return available;
}
public void setAvailable(boolean available) {
this.available = available;
public void checkOut() {
if (available) {
available = false;
System.out.println("Item checked out: " + getTitle());
} else {
System.out.println("Item is not available for checkout: " + getTitle());
public void checkIn() {
available = true;
System.out.println("Item checked in: " + getTitle());
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
LibraryItem that = (LibraryItem) o;
return id == that.id;
@Override
public int hashCode() {
return title.hashcode() * 29 + id * 29 * 29;
@Override
public String toString() {
return "LibraryItem - ID: " + id + ", Title: " + title + ", Available: " + available;
class Library<T extends LibraryItem> {
private Map<Integer, T> itemMap;
private Set<T> checkedOutItems;
public Library() {
this.itemMap = new HashMap<>();
this.checkedOutItems = new HashSet<>();
public void addItem(T item) {
itemMap.put(item.getId(), item);
public void removeItem(T item) {
itemMap.remove(item.getId());
checkedOutItems.remove(item);
public void displayAvailableItems() {
System.out.println("Available Items:");
for (T item : itemMap.values()) {
if (item.isAvailable()) {
System.out.println(item);
public void displayCheckedOutItems() {
System.out.println("Checked Out Items:");
for (T item : checkedOutItems) {
System.out.println(item);
public void checkOutItem(int itemId) {
T item = itemMap.get(itemId);
if (item != null && item.isAvailable()) {
item.checkOut();
checkedOutItems.add(item);
} else {
System.out.println("Item with ID " + itemId + " is not available for checkout.");
public void checkInItem(int itemId) {
T item = itemMap.get(itemId);
if (item != null && !item.isAvailable()) {
item.checkIn();
checkedOutItems.remove(item);
} else {
System.out.println("Item with ID " + itemId + " is not checked out.");
class Book extends LibraryItem {
private String author;
public Book(String title, String author) {
super(title);
this.author = author;
public String getAuthor() {
return author;
public String getAuthorInfo() {
return "Author: " + author;
@Override
public String toString() {
return "Book - ID: " + getId() + ", Title: " + getTitle() + ", " + getAuthorInfo() + ", Available: " +
isAvailable();
}
class DVD extends LibraryItem {
private String director;
public DVD(String title, String director) {
super(title);
this.director = director;
public String getDirector() {
return director;
public String getDirectorInfo() {
return "Director: " + director;
@Override
public String toString() {
return "DVD - ID: " + getId() + ", Title: " + getTitle() + ", " + getDirectorInfo() + ", Available: " +
isAvailable();
}
Problem 3:
public static void main(String[] args) {
try {
int result = 10 / 0;
System.out.println("Result: " + result);
} catch (ArithmeticException e) {
System.out.println("Your Full Name");
e.printStackTrace();
} finally {
System.out.println("KIU");
}
}