Programming - Java All-In-One Exercise (Solution)

in #programming5 years ago (edited)

Exercise Post

    After more than one week I now present to you the Solution of the Exercise that I uploaded for you. This is an edited Task and it was much more difficult the way our professor told us to do it. I will upload this Exercise again when we have talked about GUI's and stuff, and that will be the real Task I had to do (almost). So, without further do, here the Solution of the Exercise.


Solution:

   When I tried to solve the problem I first began creating the Classes and created the variables (data) and basic functions (getters-setters, constructors, toString) that are needed. Afterwards, I began creating the menu in the Driver class and defined function there (as static ones) or in the Condominium, Apartment Class and called them in the menu using the objects of type Condominium and the Apartment ArrayList of the Condominum. One little trick I used is that I set the ArrayList of Apartment to public static, so that it can be accessed anywhere. Finally, before showing the Code I wanted to tell that I use different Kinds of Constructors and not everything in the toString() method of the class get's printed so that it is easier for the textfile functions (you could use a separate function that prints in another way like printtoFile() or something). 

So, here comes the Code:

Address:

import java.io.Serializable;
public class Address implements Serializable { // Address.java
    private String city;
    private String street;
    private int number;
    private int zip;
    // CONSTRUCTORS
    public Address() {
        city = null;
	street = null;
	number = -1;
	zip = -1;
    }
    public Address(String city, String street, int number, int zip) {
        this.city = city;
        this.street = street;
        this.number = number;
        this.zip = zip;
    }
    // GETTERS-SETTERS
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getStreet() {
        return street;
    }
    public void setStreet(String street) {
        this.street = street;
    }
    public int getNumber() {
        return number;
    }
    public void setStreetNumber(int number) {
        this.number = number;
    }
    public int getZip() {
        return zip;
    }
    public void setZip(int zip) {
        this.zip = zip;
    }
    // METHODS
    public String toString() {
        return city + "\n" + street + "\n" + number + " " + zip;
    }
}


Person:

import java.io.Serializable;
public class Person implements Serializable { // Person.java
    private int id;
    private String name;
    private String surname;
    private Address a;
    // CONSTRUCTORS
    public Person() {
        id = -1;
        name = null;
        surname = null;
        a = null;
    }

    public Person(int id, String name, String surname, Address a) {

        this.id = id;
        this.name = name;
        this.surname = surname;
	this.a = a;
    }
    // GETTERS-SETTERS
    public int getId() {
        return id;
    }
    public void setId(int id) {
	this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSurname() {
	return surname;
    }
    public void setSurname(String surname) {
	this.surname = surname;
    }
    public Address getA() {
        return a;
    }
    public void setA(Address a) {
	this.a = a;
    }	
    // METHODS
    public String toString() {
	return id + "\n" + name + "\n" + surname + "\n" + a.toString();
    }
}


Owner:

import java.io.Serializable;
public class Owner extends Person implements Serializable { // Owner.java
    private Apartment apartment;
    // CONSTRUCTORS
    public Owner() {
	   super();
    }
    public Owner(int id, String name, String surname, Address a) {
	super(id, name, surname, a);
    }
    // GETTERS-SETTERS
    public Apartment getApartment() {
	return apartment;
    }
    public void setApartment(Apartment apartment) {
	this.apartment = apartment;
    }
    // METHODS
    public String toString() {
	return super.toString();
    }	
}


Administrator:

import java.io.Serializable;
public class Administrator extends Person implements Serializable { // Administrator.java
    private Condominium condo;
    // CONSTRUCTORS
    public Administrator() {
	super();
    }
    public Administrator(int id, String name, String surname, Address a) {
    	super(id, name, surname, a);
    }
    // GETTERS-SETTERS
    public Condominium getCondo() {
	return condo;
    }
    public void setCondo(Condominium condo) {
	this.condo = condo;
    }
    // METHODS
    public String toString() {
	return super.toString();
    }
}


Apartment:

import java.io.Serializable;
import java.util.StringTokenizer;
public class Apartment implements Serializable { // Apartment.java
    private int condominiumID;
    private String apartmentID;
    private Owner owner;
    private int squareMeters;
    private int millRate;
    private double propertyCharges;
    // CONSTRUCTORS
    public Apartment() {
	condominiumID = -1;
	apartmentID = null;
	squareMeters = -1;
	millRate = 0;
	propertyCharges = 0.0;
    }
    // 2 overloaded Constructors to make it easier for File Reading
    public Apartment(int condominiumID, String apartmentID, int squareMeters) {
	this.condominiumID = condominiumID;
	this.apartmentID = apartmentID;
	this.squareMeters = squareMeters;
	millRate = calculateMillRate();
	propertyCharges = 0;
    }
    public Apartment(int condominiumID, String apartmentID, Owner owner, int squareMeters, 
    int millRate, double propertyCharges) {
	this.condominiumID = condominiumID;
	this.apartmentID = apartmentID;
	this.owner = owner;
	this.squareMeters = squareMeters;
	this.millRate = millRate;
	this.propertyCharges = propertyCharges;
    }
    // GETTERS-SETTERS
    public int getCondominiumID() {
	return condominiumID;
    }
    public void setCondominiumID(int condominiumID) {
	this.condominiumID = condominiumID;
    }
    public String getApartmentID() {
	return apartmentID;
    }
    public void setApartmentID(String apartmentID) {
	this.apartmentID = apartmentID;
    }
    public Owner getOwner() {
	return owner;
    }
    public void setOwner(Owner owner) {
	this.owner = owner;
    }
    public int getSquareMeters() {
	return squareMeters;
    }
    public void setSquareMeters(int squareMeters) {
	this.squareMeters = squareMeters;
    }
    public int getMillRate() {
	return millRate;
    }
    public void setMillRate(int millRate) {
	this.millRate = millRate;
    }
    public double getPropertyCharges() {
	return propertyCharges;
    }
    public void setPropertyCharges(double propertyCharges) {
	this.propertyCharges = propertyCharges;
    }
    // METHODS
    public int calculateMillRate() {
	    int apartmentMilm;
	    int N = Condominium.apartments.size();
	    if (N == 0) {
		return 1000;
	    }
	    double[] weight = new double[N + 1];
	    // loop all apartments to calculate weight
	    for (int i = 0; i < N; i++) {
                weight[i] = Condominium.apartments.get(i).getSquareMeters();
		// we use an object that does the same as strtok() in C
		// and splits the String where a specific character appears
		StringTokenizer strTok = new StringTokenizer(Condominium.apartments.get(i).getApartmentID(), "_");
		// we get the first "number" that represents the floor
		// and convert it to an Integer
		int floor = Integer.parseInt(strTok.nextToken());
		weight[i] = weight[i] * (1 + ((floor - 1) * 0.2));
	    }
	    // the new apartment
	    StringTokenizer strTok = new StringTokenizer(apartmentID, "_");
	    int floor = Integer.parseInt(strTok.nextToken());
	    weight[N] = squareMeters * (1 + ((floor - 1) * 0.2));
	    // calculate sum of weights
	    double sumWeight = 0;
	    for (int i = 0; i < N + 1; i++) {
		sumWeight += weight[i];
	    }
	    // recalculate millRate of all apartments
	    for (int i = 0; i < N; i++) {
		Condominium.apartments.get(i).setMillRate((int) ((weight[i] / sumWeight)));
	    }
	    // calculate apartment's millRate
	    apartmentMilm = (int) ((weight[N] / sumWeight));
	    return apartmentMilm;
    }
    public String toString() {
	return condominiumID + "\n" + apartmentID + "\n" + owner.toString() + "\n" 
        + squareMeters + " " + millRate + " " + propertyCharges;
    }
}


Condominium:

import java.io.Serializable;
import java.util.ArrayList;
public class Condominium implements Serializable { // Condominium.java
    private int id;
    private Address a;
    private Administrator admin;
    // we make it public static so that is visible everywhere
    public static ArrayList<Apartment> apartments = new ArrayList<>();
    private double expenditure;
    // CONSTRUCTORS
    public Condominium() {
	id = -1;
	a = null;
	expenditure = 0.0;
    }
    public Condominium(int id, Address a) {
	this.id = id;
	this.a = a;
	expenditure = 0.0;
    }
    // GETTERS-SETTERS
    public int getId() {
	return id;
    }
    public void setId(int id) {
	this.id = id;
    }
    public Address getA() {
	return a;
    }
    public void setA(Address a) {
	this.a = a;
    }
    public Administrator getAdmin() {
	return admin;
    }
    public void setAdmin(Administrator admin) {
	this.admin = admin;
    }
    // expenditure will be inputed with another method
    // METHODS
    public void findApartment(String apartmentcode) {
	boolean found = false;
	for (int i = 0; i < apartments.size(); i++) {
		// checking equality of strings
		if (apartmentcode.equals(apartments.get(i).getApartmentID())) {
			System.out.println("Apartment:\n" + apartments.get(i));
			found = true;
			return;
		}
	}
	if (found != true) {
		System.out.println("No apartment found with id " + apartmentcode);
	}
    }
    public void printApartments() {
	System.out.println("Apartments:");
	for (int i = 0; i < apartments.size(); i++) {
		System.out.println(apartments.get(i));
	}
    }
    public void printApartmentCharges() {
	System.out.println("Apartment Charges:");
	for (int i = 0; i < apartments.size(); i++) {
		System.out.println(apartments.get(i).getApartmentID() + ": " +
                 apartments.get(i).getPropertyCharges());
	}
    }
    public void setCondominiumPropertyCharges(int condominiumCode, double expenditure) {
	if (condominiumCode == this.id) {
		this.expenditure = expenditure;
	} else {
		System.out.println("No Condominium has the id " + condominiumCode);
	}
    }
    public void apartmentPropertyCharges() {
	for (int i = 0; i < apartments.size(); i++) {
		apartments.get(i).setPropertyCharges(expenditure * apartments.get(i).getMillRate() / 1000);
	}
    }
    public String toString() {
	return id + "\n" + a.toString() + "\n" + admin.toString() + 
        "\n" + expenditure ;
    }
}


Driver:

import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
public class Driver { // Driver.java
    public static void main(String[] args) {
	Scanner scan = new Scanner(System.in);
	int choice;
	ArrayList<Owner> owners = new ArrayList<>();
	Administrator admin = null;
	Condominium condo = null;
	while (true) {
		// print menu
		System.out.println("1. Insert Administator/Condominium");
		System.out.println("2. Insert Owner/Apartment");
		System.out.println("3. Print All Apartments");
		System.out.println("4. Find Apartment using Code");
		System.out.println("5. Find Property charges of specific Owner");
		System.out.println("6. Calculate Expenditure of Condominium");
		System.out.println("7. Calculate/Print Property charges of all Apartments");
		System.out.println("8. Save to Text File");
		System.out.println("9. Load from Text File");
		System.out.println("10. Save to Serializable File");
		System.out.println("11. Load from Serializable File");
		System.out.println("0. Exit");
		System.out.print("Choice: ");
		choice = scan.nextInt();
		switch (choice) {
		case 0:
			scan.close(); // close scanner
			System.exit(0); // exit programm
		case 1:
			admin = insertAdmin();
			condo = insertCondo();
			// set the compositionPartners
			admin.setCondo(condo);
			condo.setAdmin(admin);
			break;
		case 2:
			if (condo == null || admin == null) {
				System.out.println("run 1. first");
				break;
			}
			Owner owner;
			Apartment apartment;
			owner = insertOwner();
			apartment = insertApartment();
			// set the compositionPartners
			owner.setApartment(apartment);
			apartment.setOwner(owner);
			// insert in lists
			owners.add(owner);
			condo.apartments.add(apartment);
			break;
		case 3:
			condo.printApartments();
			break;
		case 4:
			System.out.print("ApartmentID: ");
			String apartmentcode = scan.next();
			condo.findApartment(apartmentcode);
			break;
		case 5:
			System.out.print("Owner ID: ");
			int id = scan.nextInt();
			findPropertyCharges(id);
			break;
		case 6:
			System.out.println("Expenditure: ");
			double expenditure = scan.nextDouble();
			condo.setCondominiumPropertyCharges(condo.getId(), expenditure);
			break;
		case 7:
			// calculate charges
			condo.apartmentPropertyCharges();
			// print charges
			condo.printApartmentCharges();
			break;
		case 8:
			try {
				PrintWriter writer = new PrintWriter(new FileOutputStream("condominium.txt"));
				// condo data that contains admin data
				writer.println(condo.toString());
				// apartment data that contains owner data
				writer.println(Condominium.apartments.size());
				for (int i = 0; i < Condominium.apartments.size(); i++)
                                    writer.println(Condominium.apartments.get(i).toString());
				}
				writer.close();
			} catch (IOException ioe) {
				System.out.println(ioe.getMessage());
			}
			break;
		case 9:
			try {
				Scanner reader = new Scanner(new FileInputStream("condominium.txt"));
				// Condo Data
				int tempCondoID = Integer.parseInt(reader.nextLine());
				// Condo Address
				String tempCity = reader.nextLine();
				String tempStreet = reader.nextLine();
				int tempStreetNumber = reader.nextInt();
				int tempPostalCode = reader.nextInt();
				reader.nextLine();
				Address tempA = new Address(tempCity, tempStreet, tempStreetNumber, tempPostalCode);
				condo = new Condominium(tempCondoID, tempA);
				// Admin Data
				int tempAdminID = Integer.parseInt(reader.nextLine());
				String tempName = reader.nextLine();
				String tempSurname = reader.nextLine();
				// Admin Address
				tempCity = reader.nextLine();
				tempStreet = reader.nextLine();
				tempStreetNumber = reader.nextInt();
				tempPostalCode = reader.nextInt();
				reader.nextLine();
				Address tempA2 = new Address(tempCity, tempStreet, tempStreetNumber, tempPostalCode);
				admin = new Administrator(tempAdminID, tempName, tempSurname, tempA2);
				condo.setCondominiumPropertyCharges(tempCondoID, Double.parseDouble(reader.nextLine()));
				// set the compositionPartners
				admin.setCondo(condo);
				condo.setAdmin(admin);
				// Apartment Data
				int apartmentsCount = Integer.parseInt(reader.nextLine());
				for (int i = 0; i < apartmentsCount; i++) {
					Apartment tempApartment;
					Owner tempOwner;
					tempCondoID = Integer.parseInt(reader.nextLine());
					String tempApartmentID = reader.nextLine();
					// Owner Data
					int tempOwnerID = Integer.parseInt(reader.nextLine());
					tempName = reader.nextLine();
					tempSurname = reader.nextLine();
					// Owner Address
					tempCity = reader.nextLine();
					tempStreet = reader.nextLine();
					tempStreetNumber = reader.nextInt();
					tempPostalCode = reader.nextInt();
					reader.nextLine();
					Address tempA3 = new Address(tempCity, tempStreet, tempStreetNumber, tempPostalCode);
					tempOwner = new Owner(tempOwnerID, tempName, tempSurname, tempA3);
					owners.add(tempOwner);
					int tempSquareMeters = reader.nextInt();
					int tempMillRate = reader.nextInt();
					double tempPropertyCharges = Double.parseDouble(reader.nextLine());
					// add Apartment to list
                                        tempApartment = new Apartment(tempCondoID, tempApartmentID, tempOwner, tempSquareMeters, tempMillRate, tempPropertyCharges);
                                        condo.apartments.add(tempApartment);
                                }
				// set the compositionPartners
                                for (int i = 0; i < owners.size(); i++){
                                    for (int j = 0; j < condo.apartments.size(); j++) {
                                        // if owner id is equal to apartments owner
                                        if (owners.get(i).getId() == condo.apartments.get(j).getOwner().getId()) {
                                          owners.get(i).setApartment(condo.apartments.get(j));
                                            condo.apartments.get(j).setOwner(owners.get(i));
                                        }
                                    }
                                } 
				reader.close();
			} catch (IOException ioe) {
				System.out.println(ioe.getMessage());
			}
			break;
		case 10:
			try {
				ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("condominium.dat"));
				// condo data that contains admin data
				oos.writeObject(condo);
				// apartment data that contains owner data
				oos.writeInt(Condominium.apartments.size());
				for (int i = 0; i < Condominium.apartments.size(); i++) {
					oos.writeObject(Condominium.apartments.get(i));
				}
				oos.close();
			} catch (IOException ioe) {
				System.out.println(ioe.getMessage());
			}
			break;
		case 11:
			try {
				ObjectInputStream ois = new ObjectInputStream(new FileInputStream("condominium.dat"));
				// Condo Data
				condo = (Condominium) ois.readObject();
				// Fill Admin with Condo's Admin
				admin = condo.getAdmin();
				// set the compositionPartners
				admin.setCondo(condo);
				condo.setAdmin(admin);
				// Apartment Data
				int apartmentsCount = ois.readInt();
				for (int i = 0; i < apartmentsCount; i++) {
					Apartment tempApartment = (Apartment) ois.readObject();
					// add to ArrayList of Condominium
					Condominium.apartments.add(tempApartment);
					// Fill Owner ArrayList with Owners of apartment
					owners.add(Condominium.apartments.get(i).getOwner());
				}
				ois.close();
			} catch (IOException | ClassNotFoundException ioe) {
				System.out.println(ioe.getMessage());
			}
			break;
		default:
			System.out.println("Wrong Choice!");
		}
	}
    }
    // METHODS
    public static Administrator insertAdmin() {
        Scanner scan = new Scanner(System.in);
	// get information for admin
	System.out.print("Admin id: ");
	int id = scan.nextInt();
	System.out.print("Admin name: ");
	String name = scan.next();
	System.out.print("Admin surname: ");
	String surname = scan.next();
	// get information for address
	System.out.println("City: ");
	String city = scan.next();
	System.out.println("Street: ");
	String street = scan.next();
	System.out.println("Number: ");
	int number = scan.nextInt();
	System.out.println("ZIP: ");
	int zip = scan.nextInt();
	Address a = new Address(city, street, number, zip);
	return new Administrator(id, name, surname, a);
    }
    public static Condominium insertCondo() {
	Scanner scan = new Scanner(System.in);
	// get information for condo
	System.out.print("Condo id: ");
	int id = scan.nextInt();
	// get information for address
	System.out.println("City: ");
	String city = scan.next();
	System.out.println("Street: ");
	String street = scan.next();
	System.out.println("Number: ");
	int number = scan.nextInt();
	System.out.println("ZIP: ");
	int zip = scan.nextInt();
	Address a = new Address(city, street, number, zip);
	return new Condominium(id, a);
    }
    public static Owner insertOwner() {
	Scanner scan = new Scanner(System.in);
	// get information for owner
	System.out.print("Owner id: ");
	int id = scan.nextInt();
	System.out.print("Owner name: ");
	String name = scan.next();
	System.out.print("Owner surname: ");
	String surname = scan.next();
	// get information for address
	System.out.println("City: ");
	String city = scan.next();
	System.out.println("Street: ");
	String street = scan.next();
	System.out.println("Number: ");
	int number = scan.nextInt();
	System.out.println("ZIP: ");
	int zip = scan.nextInt();
	Address a = new Address(city, street, number, zip);
	return new Owner(id, name, surname, a);
    }
    public static Apartment insertApartment() {
	Scanner scan = new Scanner(System.in);
	// get information for apartment
	System.out.print("Condo id: ");
	int condo_id = scan.nextInt();
	System.out.print("Apartment id: ");
	String apartment_id = scan.next();
	System.out.print("Square Meters: ");
	int squareMeters = scan.nextInt();
	return new Apartment(condo_id, apartment_id, squareMeters);
    }
    public static void findPropertyCharges(int id) {
	for (int i = 0; i < Condominium.apartments.size(); i++) {
		// check equality of ids
		if (Condominium.apartments.get(i).getOwner().getId() == id) {
			System.out.println(
						"Owner with id " + id + " has to pay " + Condominium.apartments.get(i).getPropertyCharges());
			return;
		}
	}
    }
}



    You don't have to do everything exactly the way I did it and there could be also some Bugs and things I didn't see and so on... But, I think it is a pretty good Exercise that shows you how to set-up and use most of the Java Stuff I showed you until now. I will post you the same Exercise extended with GUI and other Stuff, before I leave for Vacation and when I return I will post the Solution exactly the same way as I did this time.

That was the end of today's post. Hope you enjoyed it! :)

Sort:  

I will try to edit the Code so that this scrollbars go away. The problem is it deletes the whole line instead of a character and when pasting it does weird stuff and puts it in different Lines and Rows and stuff.

Been through similar pain myself. Replace tabs with 4 spaces and also wrap lines that are too long. It is possible to get rid of them, flick through a few of my posts and you will see my wrapping tweaks

Thank You, I guess I got rid in most places using 4 spaces. The only problem now is the File Input and Output Code that I put directly inside of the case and not as a method. Guess I will rewrite it as a method to make it easier to read.

Congratulations @drifter1! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

You got a First Reply

Click on any badge to view your own Board of Honor on SteemitBoard.
For more information about SteemitBoard, click here

If you no longer want to receive notifications, reply to this comment with the word STOP

By upvoting this notification, you can help all Steemit users. Learn how here!

Coin Marketplace

STEEM 0.22
TRX 0.06
JST 0.025
BTC 19816.83
ETH 1338.23
USDT 1.00
SBD 2.47