Week01-02

/*
 * HelloWorld.java
 * A traditional Hello World program!
 */

// In Java, all programs reside in a class. This class is called HelloWorld, 
// and should be saved in a file called HelloWorld.java. This class has a single
// method called main, which is the entry point to the program.
//
// Compiling the class with javac HelloWorld.java will produce a bytecode file
// called HelloWorld.class if compilation is successful. This bytecode can then
// be run on any machine with a java bytecode interpreter. You can run the
// bytecode in a console by typing java HelloWorld.

public class HelloWorld {
	public static void main(String[] arg) {

		String helloString = "Hello";
		String worldString = "World!";

		// In Java the System.out.println command displays the argument to the 
		// console. However the command below doesn't work, because helloWorldAString
		// has not been declared. Try compiling this file to see what happens, 
		// and take a careful look at the error message that is produced.

		System.out.println(helloString + " " + worldString);

		// In Java, we can use the '+' operator to concatenate strings, 
		// so to fix this problem, either change the argument passed to the
		// System.out.println method from (helloWorldString) to 
		// (helloString + " " + worldString)
		// or declare the variable helloWorldString before it is used by 
		// System.out.println by inserting 
		// String helloWorldString = helloString + " " + worldString;

		// In Java a variable can be declared anywhere in the code, so it is
		// possible to declare a variable just before it is used, which makes for
		// code that is easier to read and understand.

		// It is conventional to use mixed case for variable names and method 
		// names in Java, with with the first letter lower case, and then the 
		// first letter of each internal word in upper case -- e.g. helloString.
		// Class names start with a capital letter -- e.g. HelloWorld.java

		// details at: http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-135099.html

	}
}
/*
 * QuadraticSolver.java  	1.1 26/08/2011
 *
 * Copyright (c) University of Sheffield 2011
 */

import java.math.*;

import sheffield.*;

/**
 * QuadraticSolver.java
 * solves quadratic equations for x given a*x*x + b*x + c = 0
 * the code should be modified so that a, b, and c are input by the user
 *
 * @author Mark Stevenson ([email protected])
 * @author (based on code written by Richard Clayton)
 * @version 1.1 26 August 2011
 */

public class QuadraticSolver {
	public static void main(String[] arg) {

		// default values for coefficients a, b, and c
		// initially, these are stored as both integers and float.
//		int    aInt =    1,    bInt = 2000000, cInt =    1;
//		double aFloat = 1, bFloat = 2000000, cFloat = 1;

		EasyReader keyboard = new EasyReader();

		double aFloat = keyboard.readDouble("Input a value for a: ");
		double bFloat = keyboard.readDouble("Input a value for b: ");
		double cFloat = keyboard.readDouble("Input a value for c: ");

		// declare variables to store the two values of x that satisfy the equation
		double x1, x2;

		// work out the solution with int types
//		aInt -= 1/2;
//		x1 = (-1 * bInt + Math.sqrt(bInt*bInt - 4 * aInt * cInt)) / (2 * aInt);
//		x2 = (-1 * bInt - Math.sqrt(bInt*bInt - 4 * aInt * cInt)) / (2 * aInt);
//		System.out.println("Solution with integer types is x1 = " + x1 + ", and x2 = " + x2 );

		// work out the solution with double types
//		aFloat -= 0.5;
		x1 = (-1 * bFloat + Math.sqrt(bFloat * bFloat - 4 * aFloat * cFloat)) / (2 * aFloat);
		x2 = (-1 * bFloat - Math.sqrt(bFloat * bFloat - 4 * aFloat * cFloat)) / (2 * aFloat);
		System.out.println("Solution with double types is  x1 = " + x1 + ", and x2 = " + x2);

		System.out.println("a*x1*x1 + b*x1 + c = " + (aFloat * x1 * x1 + bFloat * x1 + cFloat));
		System.out.println("a*x2*x2 + b*x2 + c = " + (aFloat * x2 * x2 + bFloat * x2 + cFloat));

	} //main
} // class QuadraticSolver
import sheffield.*;

public class CycleComputer {
	public static void main(String[] args) {
		EasyReader myFile = new EasyReader("./timings.txt");

		int amount = myFile.readInt();
		double[] timings = new double[amount]; // Unit: s

		for (int i = 0; i < amount; i++) {
			timings[i] = myFile.readDouble();
		}

		Trip myTrip = new Trip(0.665, amount, timings);

		double[] speeds = myTrip.getInstantaneousSpeed();

		for (int i = 0; i < amount; i++) {
			System.out.printf("Instantaneous speed: %.2f km/h\n", speeds[i]);
		}

		System.out.printf("Max speed in journey is: %.2f km/h\n", myTrip.getMaxSpeed());

		System.out.printf("Total distance travelled: %.2f km\n", myTrip.getTotalDistance());

		System.out.printf("Total time taken: %.2f mins\n", myTrip.getTotalTime() / 60);
	}
}
public class Trip {
	private static final double PI = 3.1415927;

	private double diameter; // Unit: m

	private double circumference; // Unit: m

	private int rotationAmount;

	private double timings[]; // Unit: s

	private double speeds[]; // Unit: km/h

	private double maxSpeed = 0; // Unit: km/h

	private double totalDistance = 0; // Unit: m

	private double totalTime = 0; // Unit: s

	public Trip(double diameter, int rotationAmount, double[] timings) {
		this.diameter = diameter;
		this.circumference = diameter * PI;
		this.rotationAmount = rotationAmount;
		this.timings = timings;

		calcInstantaneousSpeed();
		calcMaxSpeed();
		clacTotalDistance();
		calcTotalTime();
	}

	public double getDiameter() {
		return diameter;
	}

	public double getCircumference() {
		return circumference;
	}

	public int getRotationAmount() {
		return rotationAmount;
	}

	private void calcInstantaneousSpeed() {
		speeds = new double[rotationAmount]; // Unit: km/h

		for (int i = 0; i < rotationAmount; i++) {
			speeds[i] = circumference / timings[i] * 3.6; // m/s -> km/h
		}
	}

	private void calcMaxSpeed() {
		for (int i = 0; i < rotationAmount; i++) {
			maxSpeed = maxSpeed > speeds[i] ? maxSpeed : speeds[i];
		}
	}

	private void clacTotalDistance() {
		for (int i = 0; i < rotationAmount; i++) {
			totalDistance += timings[i] / 3600 * speeds[i];
		}
	}

	private void calcTotalTime() {
		for (int i = 0; i < rotationAmount; i++) {
			totalTime += timings[i];
		}
	}

	public double[] getInstantaneousSpeed() {
		return speeds;
	}

	public double getMaxSpeed() {
		return maxSpeed;
	}

	public double getTotalDistance() {
		return totalDistance;
	}

	public double getTotalTime() {
		return totalTime;
	}
}

Week 03

/*
 * FoodStore.java  	1.0 26/08/2011
 *
 * Copyright (c) University of Sheffield 2011
 */


/**
 * FoodStore.java
 * <p>
 * A simple class used in COM6516 lab class
 */

// this line of code declares the class
public class FoodStore {
	// this is the constructor, which is called when a new object is created
	// the constructor name is always the same as the class name
	// classes can have more than one constructor
	// the constructor make take zero or more parameters
	// in this case there is one parameter (int a) that is used to set the
	// instance field of the class
	public FoodStore(int a) {
		amountStored = a;
	}


	// these are class methods, which enable the value of the instance
	// field to be modified
	// these methods have a public access modifier, because they need to
	// be called by other classes
	// neither class method returns anything, so the return type is void
	public void depositFood(int amountToDeposit) {
		depositAmount += amountToDeposit;
		amountStored = amountStored + amountToDeposit;
	}

	public void withdrawFood(int amountToWithdraw) {
		withdrawAmount += amountToWithdraw;
		amountStored = amountStored - amountToWithdraw;
	}

	// these are accessor methods, which return the value of the
	// instance field
	public int getAmountStored() {
		return (amountStored);
	}

	// this is the instance field, which is an attribute associated with
	// each object of the FoodStore class
	// the access modifier is private, which means that this field can 
	// only be accessed through the class methods
	// by keeping instance fields private there is a well specified interface 
	// to the data associated with each object
	// this approach is called encapsulation
	private int amountStored;

	private int depositAmount = 0;
	private int withdrawAmount = 0;

	public int getDepositAmount() {
		return depositAmount;
	}

	public int getWithdrawAmount() {
		return withdrawAmount;
	}
}
public class TestFoodStore {
	public static void main(String[] args) {
		// create a new FoodStore object called MyFoodStore
		// by invoking the constructor
		FoodStore MyFoodStore = new FoodStore(10);

		// display the amount stored by calling the getAmountStored
		// method associated with the MyFoodStore object
		System.out.println("Contains " + MyFoodStore.getAmountStored());

		System.out.println("Deposit 5 foods.");

		MyFoodStore.depositFood(5);

		System.out.println("Contains " + MyFoodStore.getAmountStored());

		System.out.println("Withdraw 10 foods.");

		MyFoodStore.withdrawFood(10);

		System.out.println("Contains " + MyFoodStore.getAmountStored());
	}
}
import sheffield.*;

class FoodManage {
	public static void main(String[] args) {
		FoodStore MyFoodStore = new FoodStore(10);

		EasyReader keyboard = new EasyReader();

		int numberOfWithdrawal = 0;
		int numberOfDeposit = 0;
		int numberOfRefuse = 0;

		while (true) {
			int amount = keyboard.readInt("Food manage: ");
			if (amount > 0) {
				MyFoodStore.depositFood(amount);
				System.out.println("Deposit " + amount + " foods.");
				numberOfDeposit++;
			} else if (amount < 0) {
				if (MyFoodStore.getAmountStored() < -amount) {
					System.out.println("Transaction refused.");
					numberOfRefuse++;
				} else {
					MyFoodStore.withdrawFood(-amount);
					System.out.println("Withdraw " + (-amount) + " foods.");
					numberOfWithdrawal++;
				}
			} else {
				System.out.println("Nothing to do.");
			}

			System.out.println("Total number of withdrawals: " + numberOfWithdrawal);
			System.out.println("Total number of deposits: " + numberOfDeposit);
			System.out.println("Total number of refused transactions: " + numberOfRefuse);

			System.out.println("Total amount of food deposited: " + MyFoodStore.getDepositAmount() + " foods.");
			System.out.println("Total amount of food withdrawn: " + MyFoodStore.getWithdrawAmount() + " foods.");
		}
	}
}
class TestBasket {
	public static void main(String[] args) {
		Item[] shopping = {new Item("baked beans", 0.3), new Item("tomato soup", 0.4)};
		for (Item i : shopping) {
			System.out.println(i.toString());
		}

		Basket myBasket = new Basket(shopping);

		System.out.println("Total price: " + myBasket.total());
	}
}
/**
 * Basket.java
 * <p>
 * Part of lab class for COM6516
 * Written by Mark Stevenson [email protected]
 * Based on code written by Steve Maddock
 * Last modified 19 September 2014
 */

public class Basket {

	// Constructor function
	// Create a instance of Basket
	public Basket(Item[] it) {
		items = it;
	}

	// get total price of items in the basket
	public double total() {
		double tot = 0.0;
		for (int i = 0; i < items.length; i++) {
			tot += items[i].getPrice();
		} // for loop
		return tot;
	}

	// item collections
	private Item[] items;
}
/**
 * Item.java
 * <p>
 * Part of lab class for COM6516
 * Written by Mark Stevenson [email protected]
 * Based on code written by Steve Maddock and Richard Clayton
 */

public class Item {
	public Item(String n, double p) {
		name = n;
		price = p;
	}

	public String getName() {
		return name;
	}

	public double getPrice() {
		return price;
	}

	// using ukp to denote pounds sterling as unicode pound symbol
	// does not display properly in MS Command Window
	@Override
	public String toString() {
		return ("Class type: " + getClass().getTypeName() +
				" Class name: " + getClass().getName() +
				" Name: " + name +
				" Price: " + price);
	}

	@Override
	public boolean equals(Object obj) {
		if (obj == this) return true;
		if (obj == null) return false;
		if (obj.getClass() != this.getClass()) return false;
		if (((Item) obj).getName() == this.getName() && ((Item) obj).getPrice() == this.getPrice()) return true;
		return false;
	}

	// equals method to be added here
	//public boolean equals(Object obj) {
	// check if identical objects
	// must be false if parameter is null
	// must be false if objects have different classes
	// now we can cast and do something specific for Item
	//}

	// instance fields
	private final double price;
	private final String name;

	public static void main(String[] args) {
		String TESTNAME = "testObject";
		double TESTPRICE = 10.0;
		Item testObject = new Item(TESTNAME, TESTPRICE);
		System.out.println("Name:");
		System.out.println("Actual field " + testObject.getName());
		System.out.println("Expected " + TESTNAME);
		System.out.println("Price:");
		System.out.println("Actual field " + testObject.getPrice());
		System.out.println("Expected " + TESTPRICE);
	}
}
class TestItemEquals {
	public static void main(String[] args) {
		Item tomato = new Item("Tomato", 0.2);

		Item tomatoCopy = tomato;

		System.out.println(tomato.equals(tomatoCopy));
	}
}

Week 04

class Person {
	String name;
	String birth;

	Person(String name, String birth) {
		this.name = name;
		this.birth = birth;
	}

	@Override
	public String toString() {
		return "Name: " + name + "\n" +
				"Birth: " + birth;
	}
}
class Student extends Person {
	private String course;

	Student(String name, String birth, String course) {
		super(name, birth);
		this.course = course;
	}

	@Override
	public String toString() {
		return "Name: " + name + "\n" +
				"Birth: " + birth + "\n" +
				"Course: " + course;
	}
}
class Tutor extends Person {
	private String office;

	Tutor(String name, String birth, String office) {
		super(name, birth);
		this.office = office;
	}

	@Override
	public String toString() {
		return "Name: " + name + "\n" +
				"Birth: " + birth + "\n" +
				"Office: " + office;
	}
}
public class TestPerson {
	public static void main(String[] args) {
		Person testPerson = new Person("Walker", "1996/06/16");

		System.out.println(testPerson);

		Student testStudent = new Student("Neo", "1996/08/01", "COM6516");

		System.out.println(testStudent);

		Tutor testTutor = new Tutor("Anand", "1980/01/01", "C14");

		System.out.println(testTutor);
	}
}
public class Sheep extends Animal {
	public void talk() {
		System.out.println("Baaa!");
	}
}
public class NewAnimalTest {
	public static void main(String[] args) {
		Animal cow = new Cow();
		Animal pig = new Pig();
		Animal sheep = new Sheep();

		Animal[] animals = new Animal[3];
		animals[0] = cow;
		animals[1] = pig;
		animals[2] = sheep;

		for (Animal testAnimal : animals) {
			testAnimal.talk();
		}
	}
}
public abstract class Animal {
	public void talk() {
		System.out.println("Animals can't talk");
	}
}
/*
 * AnimalTest.java  	1.0 01/10/2010
 *
 * Copyright (c) University of Sheffield 2011
 */

/**
 * AnimalTest.java
 * <p>
 * Test class to demonstrate inheritance
 *
 * @author Mark Stevenson ([email protected])
 * Original code written by Guy Brown and Richard Clayton
 * @version 1.1 01 October 2010
 */

public class AnimalTest {
	public static void main(String[] args) {
		Cow daisy = new Cow();
		Pig wilbur = new Pig();
//		Animal animal = new Animal();

		Animal[] farm = new Animal[4];
//		farm[0] = animal;
		farm[0] = daisy;
		farm[1] = wilbur;

		for (int i = 0; i < 2; i++) {
			farm[i].talk();
		} // for
	} // main
}
public interface Drawable {
	public void draw(sheffield.EasyGraphics g);
}
/**
 * Shape.java
 * <p>
 * A simple class used in week 4 to implement an abstract superclass
 *
 * @version 1.1 26 August 2011
 * @author Richard Clayton  ([email protected])
 */

import sheffield.*;

public abstract class Shape implements Drawable {

	// instance fields
	// these could be implemented as protected (as shown in the lecture notes)
	// or more safely as private, with getX and getY methods as shown here
	private double x;
	private double y;

	public Shape() {
		this(0.0, 0.0);
	}

	public Shape(double x, double y) {
		setPosition(x, y);
	}

	public void setPosition(double xval, double yval) {
		x = xval;
		y = yval;
	}

	public double getX() {
		return x;
	}

	public double getY() {
		return y;
	}

	public abstract double area();

	public abstract void draw(EasyGraphics g);

}

Week 05

/**
 * Multiplication table
 * Create a table to show 1 to 9 multiplication.
 */
public class MultiplicationTable {

	/**
	 * World starts here
	 *
	 * @param args Command line arguments
	 */
	public static void main(String[] args) {
		int num = 9;
		System.out.print("  |");
		for (int i = 0; i < num; i++) {
			System.out.printf("%4d", i + 1);
		}
		System.out.println();
		System.out.print("---");
		for (int i = 0; i < num; i++) {
			System.out.print("----");
		}
		System.out.println("--");
		for (int i = 0; i < num; i++) {
			System.out.print((i + 1) + " |");
			for (int j = 0; j < num; j++) {
				System.out.printf("%4d", (i + 1) * (j + 1));
			}
			System.out.println();
		}
	}
}
/**
 * Test Circle class
 */
public class TestCircle {
	/**
	 * World starts here
	 *
	 * @param args Command line arguments
	 */
	public static void main(String[] args) {
		System.out.println(Circle.PI);
		System.out.println(Circle.radToDeg(3.141));

		Circle myCircle = new Circle(1);
		System.out.println(myCircle.toString());
		System.out.println(myCircle.getClass());

		Circle myCircle2 = new Circle(1);
		System.out.println(myCircle.equals(myCircle2));
	}
}
/*
 * Circle.java
 *
 * Copyright (c) University of Sheffield 2014
 */

public class Circle {

	// class field
	public static final double PI = 3.1415927;

	// instance field
	private double radius;

	// constructor
	public Circle(double r) {
		radius = r;
	}

	// class method
	public static double radToDeg(double angleRad) {
		return angleRad * 180.0 / PI;
	}

	// instance methods
	public double area() {
		// returns area of the circle
		return PI * radius * radius;
	}

	public double circumference() {
		// returns circumference of the circle
		return 2.0 * PI * radius;
	}

	@Override
	public String toString() {
		return "Circle radius: " + radius;
	}

	@Override
	public boolean equals(Object obj) {
		// Check if the two objects' class are same, then if the references are same
		return obj.getClass() == this.getClass() && obj == this;
	}
}
class PhDThesis extends Publication {
	private int numChapters;
	private String university;
	private String supervisor;

	PhDThesis(String title, String author, int ISBN, int numPages, int numChapters, String university, String supervisor) {
		super(title, author, ISBN, numPages);
		this.numChapters = numChapters;
		this.university = university;
		this.supervisor = supervisor;
	}

	@Override
	public String toString() {
		return super.toString() + "[numChapters=" + numChapters +
				",university=\"" + university + "\",supervisor=\"" + supervisor + "\"]";
	}
}
public class TestPublication {
	public static void main(String[] args) {
		Publication publication = new Publication();
		Book book = new Book("Test Book", "Test Author", 10000, 1000, 100);
		MagazineArticle magazineArticle = new MagazineArticle("Test Mag", "Test Author", 10001, 10, "Test Name", 1, 2, 3);
		PhDThesis phDThesis = new PhDThesis("Test Title", "Neo", 10002, 100, 10, "UoS", "Anand");

		System.out.println(publication.toString());
		System.out.println(book.toString());
		System.out.println(magazineArticle.toString());
		System.out.println(phDThesis.toString());
	}
}
import java.util.ArrayList;
import java.util.Random;

/**
 * Create a random number table
 */
public class RandomTable {

	/**
	 * World starts here
	 *
	 * @param args Command line arguments
	 */
	public static void main(String[] args) {
		Random random = new Random(0);
		int num = 9;

		ArrayList<Integer> columns = new ArrayList<>();
		while (columns.size() < num) {
			int randomNum = random.nextInt(num + 1);
			if (randomNum > 0 && !columns.contains(randomNum)) {
				columns.add(randomNum);
			}
		}

		ArrayList<Integer> rows = new ArrayList<>();
		while (rows.size() < num) {
			int randomNum = random.nextInt(num + 1);
			if (randomNum > 0 && !rows.contains(randomNum)) {
				rows.add(randomNum);
			}
		}

		System.out.print("  |");
		for (int i = 0; i < num; i++) {
			System.out.printf("%4d", columns.get(i));
		}
		System.out.println();
		System.out.print("---");
		for (int i = 0; i < num; i++) {
			System.out.print("----");
		}
		System.out.println("--");
		for (int i = 0; i < num; i++) {
			System.out.print(rows.get(i) + " |");
			for (int j = 0; j < num; j++) {
				System.out.printf("%4d", rows.get(i) * columns.get(j));
			}
			System.out.println();
		}
	}
}

Week 07

/*
 * Developed by Neo on 05/11/18 11:12.
 * Last modified 05/11/18 10:39.
 * Copyright (c) 2018. All rights reserved.
 */

import sheffield.EasyReader;

/**
 * This class can generate a walking plan for a old person
 */
public class GenerateWalkingPlan {
	/**
	 * Program starts here.
	 *
	 * @param args command line arguments.
	 */
	public static void main(String[] args) {
		// Ask for user's name and age for creating plan
		EasyReader myReader = new EasyReader();

		String name = myReader.readString("What is your name? ");
		int age = myReader.readInt("Hello " + name + ", how old are you? ");

		// Create a walk plan and print it
		WalkingPlan newPlan = new WalkingPlan(name, age);

		newPlan.generate();
		newPlan.toPrint();
	}
}
/*
 * Developed by Neo on 05/11/18 11:10.
 * Last modified 05/11/18 10:45.
 * Copyright (c) 2018. All rights reserved.
 */

import java.util.Random;

/**
 * This is walk plan for old person
 */
class WalkingPlan {
	/**
	 * This plan only contains 14 days plan
	 */
	private static final int PLAN_DAYS = 14;
	/**
	 * We define more than 1500 meters as hard day
	 */
	private static final int HARD_MODE = 1500;
	/**
	 * If two hard days in a row, we need change second day as relax day
	 */
	private static final int RELAX_MODE = 1000;

	/**
	 * User's name
	 */
	private String name;
	/**
	 * User's age
	 */
	private int age;

	/**
	 * Every days plan
	 */
	private int[] plan;
	/**
	 * The total meters of whole plan
	 */
	private int total;
	/**
	 * Average meters of this plan
	 */
	private long average;

	/**
	 * Constructor method for WalkingPlan
	 *
	 * @param name user's name
	 * @param age  user's age
	 */
	WalkingPlan(String name, int age) {
		this.name = name;
		this.age = age;

		// Initialize these variables
		plan = new int[PLAN_DAYS];
		total = 0;
		average = 0;
	}

	/**
	 * This method will generate a waling plan
	 */
	void generate() {
		Random random = new Random();
		for (int i = 0; i < PLAN_DAYS; i++) {
			plan[i] = 10 * (10 + random.nextInt(240)); // Generate a int in [100, 2500)
			if (i > 0) {
				if (plan[i] > HARD_MODE && plan[i - 1] > HARD_MODE)
					plan[i] = RELAX_MODE;
			}
			total += plan[i];
		}
		average = Math.round((double) total / PLAN_DAYS);
	}

	/**
	 * This method will print walking plan
	 */
	void toPrint() {
		System.out.println();
		System.out.println(name + "(age=" + age + ") - this is your walking plan:");
		for (int i = 0; i < PLAN_DAYS; i++) {
			System.out.print("Day " + (i + 1) + ": walk " + plan[i] + "m");
			if (plan[i] > HARD_MODE)
				System.out.println(" <--- hard");
			else
				System.out.println();
		}

		System.out.println();

		System.out.println("Total number of meters walked = " + total);
		System.out.println("Average number of meters walked per day = " + average);
	}
}

Week 08

/*
 * Developed by Neo on 12/11/18 10:21.
 * Last modified 12/11/18 10:21.
 * Copyright (c) 2018. All rights reserved.
 */

import java.util.*;

public class ListStringConvert {
	public static void main(String[] args) {
		List<String> fixedList = Arrays.asList("elephant","lion","leopard", "tiger");
		System.out.println(fixedList);
		List<String> myList = new LinkedList<String>(fixedList);

//		Iterator<String> iter = myList.iterator();
		ListIterator<String> iter = myList.listIterator();

		ArrayList<String> newList = new ArrayList<>();
		while (iter.hasNext()) {
			newList.add(iter.next().toUpperCase());
		}

		System.out.println(newList);
	}
}
import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;

/*
	HashSetTest.java

	Example class that demonstrates used of HashSet Collection.
 */

public class HashSetTest {

	public static void main(String args[]) {
		Set<Person> people = new TreeSet<Person>(new AgeComparator());// here we declare people to be the most general type, which makes it possible to swap HashSet for TreeSet.
		StringTokenizer st;
		String firstName, surname, line;
		int age;

		// read data from file
		// (The try/catch construction catches an exception, ie. error,               
		// if the file is not found) 
		try {
			Scanner file = new Scanner(new File("Person.txt"));
			// assume file has at least one line
			// that specifies the number of records
			int numData = file.nextInt();

			// read in each line, and split into tokens
			for (int i = 0; i < numData; i++) {
				line = file.next();
				st = new StringTokenizer(line, "|");
				firstName = st.nextToken();
				surname = st.nextToken();
				age = Integer.parseInt(st.nextToken());
				people.add(new Person(firstName, surname, age));
			}
			file.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			return;
		}

		// iterate through hash set
		Iterator<Person> iter = people.iterator();
		while (iter.hasNext()) {
			Person p = iter.next();
			if (!p.getSurname().equals("James") && !p.getSurname().equals("Cole")) {
				iter.remove();
			}
		}

		Iterator<Person> iter = people.iterator();
		while (iter.hasNext()) {
			Person p = iter.next();
			if (p.getSurname().equals("Wright-Phillips")) {
				iter.remove();
			}
		}

		// iterate through hash set
		Iterator<Person> i = people.iterator();
		while (i.hasNext()) {
			Person p = i.next();
			System.out.print(p);
			System.out.print(", hash code ");
			System.out.println(p.hashCode());
		}

		System.out.println("Using a comparator of a person class :");
		Person firstPerson = people.iterator().next();//grab the first one
		for (Person p : people)
			System.out.println(firstPerson + " compared to " + p + " returns " + firstPerson.compareTo(p));

		System.out.println("Using AgeComparator :");
		Comparator<Person> comparator = new AgeComparator();
		firstPerson = people.iterator().next();//grab the first one
		for (Person p : people)
			System.out.println(firstPerson + " compared to " + p + " returns " + comparator.compare(firstPerson, p));
	}
}
import java.util.*;

public class AgeComparator implements Comparator<Person> {

	public int compare(Person a, Person b) {
		return b.getAge() - a.getAge();
	}
}
/*
	Shakespeare.java

	Reads information from Shakespeare.txt
 */

import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;

public class Shakespeare {

	public static void main(String args[]) {
		String line;
		String wd;
		StringTokenizer st;
		List<String> words = new LinkedList<String>();

		// Read data from file and split into tokens, i.e. words
		// (The try/catch construction catches an exception, ie. error, 
		// if the file is not found)
		try {
			Scanner file = new Scanner(new File("Shakespeare.txt"));
			// read in each line, and split into tokens
			while (file.hasNext()) {
				line = file.next();
				st = new StringTokenizer(line, " .,:?'");
				// space, full stop, comma, etc.
				// are included as token delimiters
				// and are thus not tokens themselves
				while (st.hasMoreTokens()) {
					wd = st.nextToken();
					words.add(wd);
				}
			}
			file.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			return;
		}
		System.out.println("words: " + words);

		for (String word : words) {
			if (word.charAt(0) == 'a')
				System.out.print(word + ", ");
		}
		System.out.println();

		// Produce a sorted list
		Set<String> wds = new TreeSet<String>(new StringComparator());

		wds.addAll(words);

		System.out.println("sorted words: " + wds);

		List<String> lowerWords = new LinkedList<String>();
		for (String word : words)
			lowerWords.add(word.toLowerCase());

		Set<String> lowerWds = new TreeSet<String>(new StringComparator());

		lowerWds.addAll(lowerWords);

		for (String word : lowerWds)
			System.out.println(word + ": " + Collections.frequency(lowerWords, word));
	}
}
/*
 * Developed by Neo on 12/11/18 11:40.
 * Last modified 12/11/18 11:40.
 * Copyright (c) 2018. All rights reserved.
 */

import java.util.Comparator;

public class StringComparator implements Comparator<String> {
	@Override
	public int compare(String o1, String o2) {
		return o1.compareTo(o2);
	}
}
/*
 * Developed by Neo on 12/11/18 14:40.
 * Last modified 12/11/18 14:40.
 * Copyright (c) 2018. All rights reserved.
 */

import java.util.ArrayList;
import java.util.List;

public class ListAgain {
	public static void main(String[] args) {
		List<Integer> listA = new ArrayList<>();

		listA.add(1);
		listA.add(2);
		listA.add(3);
		listA.add(4);
		listA.add(5);

		List<Integer> listB = new ArrayList<>();

		listB.add(3);
		listB.add(4);
		listB.add(5);
		listB.add(6);
		listB.add(7);

		List<Integer> listC = new ArrayList<>(listA);

		listC.retainAll(listB);

		listA.addAll(listB);
		listA.removeAll(listC);

		System.out.println(listA);
	}
}
/*
 * Developed by Neo on 12/11/18 15:26.
 * Last modified 12/11/18 15:26.
 * Copyright (c) 2018. All rights reserved.
 */

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

public class MoreList {
	public static void main(String[] args) {
		LinkedList<Integer> listA = new LinkedList<>();

		listA.add(0);
		listA.add(1);
		listA.add(2);
		listA.add(3);
		listA.add(4);

		List<Integer> listB = new ArrayList<>();

		listB.add(5);
		listB.add(6);
		listB.add(7);
		listB.add(8);
		listB.add(9);

		ListIterator<Integer> iteratorA;
		ListIterator<Integer> iteratorB;

		// 1
		iteratorA = listA.listIterator();
		iteratorB = listB.listIterator();

		while (iteratorA.hasNext()) {
			iteratorA.next();
			if (iteratorB.hasNext())
				iteratorA.add(iteratorB.next());
		}

		while (iteratorB.hasNext()) {
			iteratorA.add(iteratorB.next());
		}

		System.out.println("List A=" + listA);
		System.out.println("List B=" + listB);

		// 2
		iteratorB = listB.listIterator();

		while (iteratorB.hasNext()) {
			iteratorB.next();
			if (iteratorB.hasNext()) {
				iteratorB.next();
				iteratorB.remove();
			}
		}

		System.out.println("List A=" + listA);
		System.out.println("List B=" + listB);

		// 3
		listA.removeAll(listB);

		System.out.println("List A=" + listA);
		System.out.println("List B=" + listB);
	}
}

Week 09

/*
 * Developed by Neo on 19/11/18 11:54.
 * Last modified 19/11/18 11:54.
 * Copyright (c) 2018. All rights reserved.
 */

import javax.swing.*;
import java.awt.*;

public class CornerString extends JFrame {
	public CornerString() {
		super("Corner String");

		//For better looks.
		try {
			UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
		} catch (Exception e) {
			e.printStackTrace();
		}

		this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		this.setSize(960, 480);
		this.setResizable(false);
		this.setLocationRelativeTo(null);

		this.setContentPane(new StringPanel());

		this.setVisible(true);
	}

	public static void main(String[] args) {
		new CornerString();
	}

	public class StringPanel extends JPanel {
		public StringPanel() {
			super(new BorderLayout());

			JLabel label1 = new JLabel("To be or not to be");
			JLabel label2 = new JLabel("To be or not to be");
			JLabel label3 = new JLabel("To be or not to be");
			JLabel label4 = new JLabel("To be or not to be");

			label1.setFont(new Font("Consolas", Font.PLAIN, 32));
			label1.setForeground(Color.BLUE);
			label2.setFont(new Font("Comic Sans MS", Font.PLAIN, 32));
			label2.setForeground(Color.GREEN);
			label3.setFont(new Font("Monospaced", Font.PLAIN, 32));
			label3.setForeground(Color.RED);
			label4.setFont(new Font("Courier", Font.PLAIN, 32));
			label4.setForeground(Color.YELLOW);

			JPanel northPanel = new JPanel();
			northPanel.setLayout(new BoxLayout(northPanel, BoxLayout.X_AXIS));

			northPanel.add(label1);
			northPanel.add(Box.createHorizontalGlue());
			northPanel.add(label2);

			JPanel southPanel = new JPanel();
			southPanel.setLayout(new BoxLayout(southPanel, BoxLayout.X_AXIS));

			southPanel.add(label3);
			southPanel.add(Box.createHorizontalGlue());
			southPanel.add(label4);

			add(northPanel, BorderLayout.NORTH);
			add(southPanel, BorderLayout.SOUTH);
		}
	}
}
/*
 * Developed by Neo on 19/11/18 15:44.
 * Last modified 19/11/18 15:44.
 * Copyright (c) 2018. All rights reserved.
 */

import javax.swing.*;

public class GIFFrame extends JFrame {
	public GIFFrame() {
		super("GIF Frame");

		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

		ImageIcon imageIcon = new ImageIcon("globe.gif", "globe");

		setSize(imageIcon.getIconWidth(), imageIcon.getIconHeight());

		JLabel imageLabel = new JLabel(imageIcon);

		add(imageLabel);

		setLocationRelativeTo(null);

		setVisible(true);
	}

	public static void main(String[] args) {
		new GIFFrame();
	}
}

Week 10

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MyFrame extends JFrame implements ActionListener {
	private MyPanel drawingPanel;

	private MyFrame() {
		int width = (int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2.0);
		int height = (int) (width / 16.0 * 9.0);
		setSize(width, height);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);

		//For better looks.
		try {
			UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
		} catch (Exception e) {
			e.printStackTrace();
		}

		drawingPanel = new MyPanel();
		drawingPanel.setPolygon(5);
		Container contentPane = this.getContentPane();
		contentPane.add(drawingPanel, BorderLayout.CENTER);

		JPanel columnOfButtons = new JPanel(new GridLayout(8, 1));
		ButtonGroup buttonGroup = new ButtonGroup();
		for (int i = 3; i < 10; i++) {
			makeRadioButton(columnOfButtons, String.valueOf(i), buttonGroup, this);
		}

		JButton exit = new JButton("Exit");
		exit.addActionListener(this);
		columnOfButtons.add(exit);

		contentPane.add(columnOfButtons, BorderLayout.EAST);

		setVisible(true);
	}

	public static void main(String[] args) {
		javax.swing.SwingUtilities.invokeLater(MyFrame::new);
	}

	private void makeRadioButton(JPanel p, String name, ButtonGroup group, ActionListener target) {
		JRadioButton b = new JRadioButton(name);
		group.add(b);
		// add it to the specified JPanel and make the JPanel listen
		p.add(b);
		b.addActionListener(target);
	}

	public void actionPerformed(ActionEvent e) {
		// Do the appropriate thing depending on which button is pressed.
		// Use the getActionCommand() method to identify the button.
		switch (e.getActionCommand()) {
			case "Exit":
				System.exit(0);
			case "3":
				drawingPanel.setPolygon(3);
				break;
			case "4":
				drawingPanel.setPolygon(4);
				break;
			case "5":
				drawingPanel.setPolygon(5);
				break;
			case "6":
				drawingPanel.setPolygon(6);
				break;
			case "7":
				drawingPanel.setPolygon(7);
				break;
			case "8":
				drawingPanel.setPolygon(8);
				break;
			case "9":
				drawingPanel.setPolygon(9);
				break;
		}
	}

}
/*
 * Developed by Neo on 26/11/18 15:37.
 * Last modified 17/11/17 14:21.
 * Copyright (c) 2018. All rights reserved.
 */

import javax.swing.*;
import java.awt.*;

public class MyPanel extends JPanel {
	private int sides = 0;

	void setPolygon(int sides) {
		this.sides = sides;
		this.repaint();
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);

		Graphics2D g2 = (Graphics2D) g;

		g2.setColor(Color.RED);

		// Make text and shapes appear smoother
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

		if (sides == 0) sides = 5;
		int[] x = new int[sides];
		int[] y = new int[sides];

		int width = getWidth();
		int height = getHeight();

		int r = (width > height ? height : width) / 3;

		for (int i = 0; i < sides; i++) {
			x[i] = (int) (width / 2 + r * Math.cos(2 * Math.PI / sides * i));
			y[i] = (int) (height / 2 + r * Math.sin(2 * Math.PI / sides * i));
		}
		Shape shape = new Polygon(x, y, sides);

		g2.draw(shape);
	}
}

Week 11

/*
 * Developed by Neo on 12/8/18 7:39 PM.
 * Last modified 11/24/17 2:18 PM.
 * Copyright (c) 2018. All rights reserved.
 */

/*
 * JCalculator.java
 * Class to produce a simple calculator in a window
 */

import javax.swing.*;
import java.awt.*;

public class JCalculator extends JFrame {
	private JCalculator() {
		super("JCalculator");
		Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
		setSize(300, 400);
		setLocationRelativeTo(null);
		Container contentPane = this.getContentPane();

		JTextArea display = new JTextArea(1, 20);
		display.setEditable(false);
		display.setFont(new Font("Courier", Font.BOLD, 40));
		display.setPreferredSize(new Dimension(300, 100));
		contentPane.add(display, BorderLayout.NORTH);

		CalculatorButtons buttons = new CalculatorButtons(display);
		contentPane.add(buttons, BorderLayout.CENTER);

	}

	public static void main(String[] args) {
		JFrame frm = new JCalculator();
		frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frm.setVisible(true);
	}
}
/*
 * Developed by Neo on 12/8/18 7:48 PM.
 * Last modified 11/24/17 2:18 PM.
 * Copyright (c) 2018. All rights reserved.
 */

/*
 * CalculatorButtons.java
 * COM6516
 */

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;

class CalculatorButtons extends JPanel {

	private static final String[] buttonLabels = {"7", "8", "9", "+", "4", "5", "6", "-",
			"1", "2", "3", "*", "0", "=", "+/-", "/"};
	private static final String[] opButtonLabels = {"+", "-", "*", "=", "+/-", "/"};

	private String displayedValue = "0";
	private String operand1;

	private enum OP {PLUS, MINUS, MULT, DIV}

	private OP operation = null;

	CalculatorButtons(JTextArea display) {
		setLayout(new GridLayout(4, 4));

		// create buttons using factory method
		for (int i = 0; i < 16; i++) {
			makeButton(this, buttonLabels[i], display);
		}
	}

	// factory method for making buttons
	private void makeButton(JPanel panel, String name, JTextArea display) {
		JButton button = new JButton(name);
		panel.add(button);
		// ADD CODE HERE TO CREATE NEW BUTTON ACTION, AND LINK BUTTON TO DISPLAY
		button.addActionListener(new ButtonAction(name, display));
	}

	private class ButtonAction implements ActionListener {
		private String theLabel;
		private JTextArea theDisplay;

		ButtonAction(String name, JTextArea display) {
			theLabel = name;
			theDisplay = display;
		}

		public void actionPerformed(ActionEvent actionEvent) {
			if (Arrays.asList(opButtonLabels).contains(theLabel)) { //If pressed + - * / = +/-
				if (theLabel.equals("=")) { //=
					if (operation == null) { //No second value
						//No need to update display
						System.out.println("No-op " + displayedValue);
					} else { //Calculate
						int result = 0;
						try {
							switch (operation) {
								case PLUS:
									result = Math.addExact(Integer.parseInt(operand1), Integer.parseInt(displayedValue));
									break;
								case MINUS:
									result = Math.subtractExact(Integer.parseInt(operand1), Integer.parseInt(displayedValue));
									break;
								case MULT:
									result = Math.multiplyExact(Integer.parseInt(operand1), Integer.parseInt(displayedValue));
									break;
								case DIV:
									//No need to check result if overflow
									result = Integer.parseInt(operand1) / Integer.parseInt(displayedValue);
									break;
							}
							System.out.println("Operands are " + operand1 + " and " + displayedValue);
							System.out.println("Result = " + result);
							displayedValue = Integer.toString(result);
							theDisplay.setText(displayedValue);
						} catch (ArithmeticException e) {
							displayedValue = "0";
							theDisplay.setText(e.getMessage());
						}
						operation = null;
					}
				} else if (theLabel.equals("+/-")) { //+/-
					int temp = Integer.parseInt(displayedValue) * -1;
					displayedValue = Integer.toString(temp);
					theDisplay.setText(displayedValue);
				} else { //+-*/
					if (operation == null) { //Continue only null operation
						switch (theLabel) {
							case "+":
								operation = OP.PLUS;
								theDisplay.setText("+");
								break;
							case "-":
								operation = OP.MINUS;
								theDisplay.setText("-");
								break;
							case "*":
								operation = OP.MULT;
								theDisplay.setText("*");
								break;
							case "/":
								operation = OP.DIV;
								theDisplay.setText("/");
								break;
						}
						operand1 = displayedValue;
						displayedValue = "0";
					}
				}
			} else { //If pressed number
				if (displayedValue.equals("0"))
					displayedValue = theLabel;
				else {
					if (displayedValue.length() < 8) //Cannot larger than 10M to prevent overflow
						displayedValue += theLabel;
				}

				theDisplay.setText(displayedValue);
			}
		}
	}
}
/*
 * Developed by Neo on 12/8/18 7:48 PM.
 * Last modified 11/24/17 2:18 PM.
 * Copyright (c) 2018. All rights reserved.
 */

/*
 * CalculatorButtons.java
 * COM6516
 */

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;

class CalculatorButtons extends JPanel {

	private static final String[] buttonLabels = {"7", "8", "9", "+", "4", "5", "6", "-",
			"1", "2", "3", "*", "0", "=", ".", "/"};
	private static final String[] opButtonLabels = {"+", "-", "*", "=", "/"};

	private String displayedValue = "0";
	private String operand1;

	private enum OP {PLUS, MINUS, MULT, DIV}

	private OP operation = null;

	private boolean dotPressed = false;

	CalculatorButtons(JTextArea display) {
		setLayout(new GridLayout(4, 4));

		// create buttons using factory method
		for (int i = 0; i < 16; i++) {
			makeButton(this, buttonLabels[i], display);
		}
	}

	// factory method for making buttons
	private void makeButton(JPanel panel, String name, JTextArea display) {
		JButton button = new JButton(name);
		panel.add(button);
		// ADD CODE HERE TO CREATE NEW BUTTON ACTION, AND LINK BUTTON TO DISPLAY
		button.addActionListener(new ButtonAction(name, display));
	}

	private class ButtonAction implements ActionListener {
		private String theLabel;
		private JTextArea theDisplay;

		ButtonAction(String name, JTextArea display) {
			theLabel = name;
			theDisplay = display;
		}

		public void actionPerformed(ActionEvent actionEvent) {
			if (Arrays.asList(opButtonLabels).contains(theLabel)) { //If pressed + - * / =
				if (theLabel.equals("=")) { //=
					if (operation == null) { //No second value
						//No need to update display
						System.out.println("No-op " + displayedValue);
					} else { //Calculate
						float result = 0;
						try {
							switch (operation) {
								case PLUS:
									result = Float.parseFloat(operand1) + Float.parseFloat(displayedValue);
									break;
								case MINUS:
									result = Float.parseFloat(operand1) - Float.parseFloat(displayedValue);
									break;
								case MULT:
									result = Float.parseFloat(operand1) * Float.parseFloat(displayedValue);
									break;
								case DIV:
									result = Float.parseFloat(operand1) / Float.parseFloat(displayedValue);
									break;
							}
							System.out.println("Operands are " + operand1 + " and " + displayedValue);
							System.out.println("Result = " + result);
							displayedValue = Float.toString(result);
							theDisplay.setText(displayedValue);
						} catch (ArithmeticException e) {
							displayedValue = "0";
							theDisplay.setText(e.getMessage());
						}
						dotPressed = true; //Because result must be float and have a "."
						operation = null;
					}
				} else { //+-*/
					if (operation == null) { //Continue only null operation
						switch (theLabel) {
							case "+":
								operation = OP.PLUS;
								theDisplay.setText("+");
								break;
							case "-":
								operation = OP.MINUS;
								theDisplay.setText("-");
								break;
							case "*":
								operation = OP.MULT;
								theDisplay.setText("*");
								break;
							case "/":
								operation = OP.DIV;
								theDisplay.setText("/");
								break;
						}
						dotPressed = false;
						operand1 = displayedValue;
						displayedValue = "0";
					}
				}
			} else { //If pressed number or "."
				if (displayedValue.length() < 8) { //Prevent overflow
					if (theLabel.equals(".")) { //Press "."
						if (!dotPressed) {
							displayedValue += theLabel;
						}
						dotPressed = true;
					} else { //Press number
						if (displayedValue.equals("0"))
							displayedValue = theLabel;
						else {
							displayedValue += theLabel;
						}
					}
				}
				theDisplay.setText(displayedValue);
			}
		}
	}
}

Assessed Lab 1

/*
 * Developed by Neo on 05/11/18 11:12.
 * Last modified 05/11/18 10:39.
 * Copyright (c) 2018. All rights reserved.
 */

import sheffield.EasyReader;

/**
 * This class can generate a walking plan for a old person
 */
public class GenerateWalkingPlan {
	/**
	 * Program starts here.
	 *
	 * @param args command line arguments.
	 */
	public static void main(String[] args) {
		// Ask for user's name and age for creating plan
		EasyReader myReader = new EasyReader();

		String name = myReader.readString("What is your name? ");
		int age = myReader.readInt("Hello " + name + ", how old are you? ");

		// Create a walk plan and print it
		WalkingPlan newPlan = new WalkingPlan(name, age);

		newPlan.generate();
		newPlan.toPrint();
	}
}
/*
 * Developed by Neo on 05/11/18 11:10.
 * Last modified 05/11/18 10:45.
 * Copyright (c) 2018. All rights reserved.
 */

import java.util.Random;

/**
 * This is walk plan for old person
 */
class WalkingPlan {
	/**
	 * This plan only contains 14 days plan
	 */
	private static final int PLAN_DAYS = 14;
	/**
	 * We define more than 1500 meters as hard day
	 */
	private static final int HARD_MODE = 1500;
	/**
	 * If two hard days in a row, we need change second day as relax day
	 */
	private static final int RELAX_MODE = 1000;

	/**
	 * User's name
	 */
	private String name;
	/**
	 * User's age
	 */
	private int age;

	/**
	 * Every days plan
	 */
	private int[] plan;
	/**
	 * The total meters of whole plan
	 */
	private int total;
	/**
	 * Average meters of this plan
	 */
	private long average;

	/**
	 * Constructor method for WalkingPlan
	 *
	 * @param name user's name
	 * @param age  user's age
	 */
	WalkingPlan(String name, int age) {
		this.name = name;
		this.age = age;

		// Initialize these variables
		plan = new int[PLAN_DAYS];
		total = 0;
		average = 0;
	}

	/**
	 * This method will generate a waling plan
	 */
	void generate() {
		Random random = new Random();
		for (int i = 0; i < PLAN_DAYS; i++) {
			plan[i] = 10 * (10 + random.nextInt(240)); // Generate a int in [100, 2500)
			if (i > 0) {
				if (plan[i] > HARD_MODE && plan[i - 1] > HARD_MODE)
					plan[i] = RELAX_MODE;
			}
			total += plan[i];
		}
		average = Math.round((double) total / PLAN_DAYS);
	}

	/**
	 * This method will print walking plan
	 */
	void toPrint() {
		System.out.println();
		System.out.println(name + "(age=" + age + ") - this is your walking plan:");
		for (int i = 0; i < PLAN_DAYS; i++) {
			System.out.print("Day " + (i + 1) + ": walk " + plan[i] + "m");
			if (plan[i] > HARD_MODE)
				System.out.println(" <--- hard");
			else
				System.out.println();
		}

		System.out.println();

		System.out.println("Total number of meters walked = " + total);
		System.out.println("Average number of meters walked per day = " + average);
	}
}

Assessed Lab 2

/*
 * Developed by Neo on 12/10/18 5:17 PM.
 * Last modified 12/10/18 11:24 AM.
 * Copyright (c) 2018. All rights reserved.
 */

import javax.swing.*;

/**
 * This class will show the Scorer GUI.
 */
public class ScorerGUI {
	/**
	 * Program starts here.
	 *
	 * @param args command line arguments
	 */
	public static void main(String[] args) {
		JFrame f = new ScoringFrame();
		//Set the frame visible
		f.setVisible(true);
	}
}
/*
 * Developed by Neo on 12/10/18 5:17 PM.
 * Last modified 12/10/18 11:24 AM.
 * Copyright (c) 2018. All rights reserved.
 */

/**
 * This class is a score record.
 */
class Scorer {
	/**
	 * Scorer's name.
	 */
	private String name;
	/**
	 * Scorer's score.
	 */
	private int score;

	/**
	 * Constructor method of Scorer.
	 *
	 * @param name  Scorer's name.
	 * @param score Scorer's score.
	 */
	Scorer(String name, int score) {
		this.name = name;
		this.score = score;
	}

	/**
	 * Getter method of name.
	 *
	 * @return Scorer's name.
	 */
	String getName() {
		return name;
	}

	/**
	 * Getter method of score.
	 *
	 * @return Scorer's score.
	 */
	int getScore() {
		return score;
	}
}
/*
 * Developed by Neo on 12/10/18 5:17 PM.
 * Last modified 12/10/18 11:38 AM.
 * Copyright (c) 2018. All rights reserved.
 */

import java.util.Comparator;

/**
 * This comparator will compare two scorer's score.
 */
public class ScoreComparator implements Comparator<Scorer> {
	/**
	 * Compare to scorer's score.
	 *
	 * @param a First scorer.
	 * @param b Second scorer.
	 * @return The difference of two scorers' score.
	 */
	@Override
	public int compare(Scorer a, Scorer b) {
		return b.getScore() - a.getScore();
	}
}
/*
 * Developed by Neo on 12/10/18 5:17 PM.
 * Last modified 12/10/18 11:47 AM.
 * Copyright (c) 2018. All rights reserved.
 */

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Set;
import java.util.TreeSet;

/**
 * This class will create a score frame.
 */
class ScoringFrame extends JFrame implements ActionListener {
	/**
	 * "Enter Score" button.
	 */
	private JButton enterButton;
	/**
	 * "Quit" button.
	 */
	private JButton quitButton;
	/**
	 * Name text field.
	 */
	private JTextField nameText;
	/**
	 * Score text field.
	 */
	private JTextField scoreText;

	/**
	 * This label show the highest score.
	 */
	private JLabel highestLabel;

	/**
	 * This set stores all scores.
	 */
	private Set<Scorer> scorerList;

	/**
	 * Constructor method of ScoringFrame.
	 */
	ScoringFrame() {
		//Set title
		super("Competition score GUI");
		//Set window's size
		setSize(960, 270);
		//Set window's position in the centre of screen
		this.setLocationRelativeTo(null);
		//Set this windows can only be closed by quit button
		this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

		//Components of this frame
		JLabel nameLabel = new JLabel("Name: ");
		nameText = new JTextField(20);
		JLabel scoreLabel = new JLabel("Score: ");
		scoreText = new JTextField(5);
		enterButton = new JButton("Enter Score");
		enterButton.addActionListener(this);

		//Top
		JPanel topPanel = new JPanel();
		topPanel.add(nameLabel);
		topPanel.add(nameText);
		topPanel.add(scoreLabel);
		topPanel.add(scoreText);
		topPanel.add(enterButton);
		this.add(topPanel, BorderLayout.NORTH);

		//Centre
		highestLabel = new JLabel("Top scorer is", JLabel.CENTER);
		highestLabel.setFont(new Font("Arial", Font.PLAIN, 36));
		highestLabel.setForeground(Color.RED);
		this.add(highestLabel, BorderLayout.CENTER);

		//Bottom
		JPanel bottomPanel = new JPanel();
		quitButton = new JButton("Quit");
		quitButton.addActionListener(this);
		bottomPanel.add(quitButton);
		this.add(bottomPanel, BorderLayout.SOUTH);

		//Use comparator to sort this set
		scorerList = new TreeSet<>(new ScoreComparator());
	}

	/**
	 * This method execute every time when action happens.
	 *
	 * @param e Action event.
	 */
	@Override
	public void actionPerformed(ActionEvent e) {
		//If clicked "Enter Score" button
		if (e.getSource().equals(enterButton)) {
			//If user did not input correct data, popup a message
			if (nameText.getText().equals("") || scoreText.getText().equals("")) {
				JLabel promptLabel = new JLabel("Please input correct data!", JLabel.CENTER);
				JOptionPane.showMessageDialog(null, promptLabel, "Oops!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			try {
				int tempScore = Integer.parseInt(scoreText.getText());
				//Check if user input correct number
				if (tempScore < 0 || tempScore >= 100)
					throw new NumberFormatException();

				//No problem, create new scorer, and store it
				Scorer newScorer = new Scorer(nameText.getText(), tempScore);
				scorerList.add(newScorer);

				//No need to check if has next
				Scorer highestScorer = scorerList.iterator().next();
				//Then set the text of high label
				highestLabel.setText("Top scorer is " + highestScorer.getName() + " with " + highestScorer.getScore() + "points");
			} catch (NumberFormatException ex) { //If user did not input correct number
				JLabel promptLabel = new JLabel("Please input correct data!", JLabel.CENTER);
				JOptionPane.showMessageDialog(null, promptLabel, "Oops!", JOptionPane.ERROR_MESSAGE);
			}
		} else if (e.getSource().equals(quitButton)) { //If clicked "Quit" button
			//Print all scorer's name and score.
			for (Scorer s : scorerList)
				System.out.println("Name = " + s.getName() + ", Score = " + s.getScore());
			//At last, goodbye my friend!
			System.exit(0);
		}
	}
}