From 965d7655edd0728e7010ac4049aa014eebe6d5ae Mon Sep 17 00:00:00 2001 From: Anna Klueva Date: Mon, 3 Jul 2017 17:20:00 +0300 Subject: [PATCH 1/2] Lesson 2. Anna K home task. Changes according to code review --- .../java/container/ContainerImpl.java | 86 ++++++++++++++++-- .../java/extendedinteger/ExtendedInteger.java | 90 ++++++++++++++----- .../changerequest/java/vehicles/Airplane.java | 58 ++++++++++++ .../changerequest/java/vehicles/Boat.java | 64 +++++++++++++ .../changerequest/java/vehicles/Car.java | 58 ++++++++++++ .../changerequest/java/vehicles/Vehicle.java | 47 ++++++++++ .../java/vehicles/VehicleFactory.java | 9 +- 7 files changed, 374 insertions(+), 38 deletions(-) create mode 100644 src/main/java/school/lemon/changerequest/java/vehicles/Airplane.java create mode 100644 src/main/java/school/lemon/changerequest/java/vehicles/Boat.java create mode 100644 src/main/java/school/lemon/changerequest/java/vehicles/Car.java create mode 100644 src/main/java/school/lemon/changerequest/java/vehicles/Vehicle.java diff --git a/src/main/java/school/lemon/changerequest/java/container/ContainerImpl.java b/src/main/java/school/lemon/changerequest/java/container/ContainerImpl.java index 0cdb298..d66366f 100644 --- a/src/main/java/school/lemon/changerequest/java/container/ContainerImpl.java +++ b/src/main/java/school/lemon/changerequest/java/container/ContainerImpl.java @@ -1,38 +1,106 @@ package school.lemon.changerequest.java.container; -public class ContainerImpl implements Container{ +import java.util.Arrays; + +public class ContainerImpl implements Container { + private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; + + private int size; + transient int[] elementData; + + public ContainerImpl() { + this.elementData = new int[INITIAL_ARRAY_SIZE]; + } @Override public int size() { - // TODO: please implement me - return 0; + return size; } @Override public void clear() { - // TODO: please implement me + // clear to let GC do its work + for (int i = 0; i < size; i++) + elementData[i] = 0; + + size = 0; } @Override public Integer get(int index) { - // TODO: please implement me - return null; + if (index >= size){ + return null; + } + return elementData[index]; } @Override public void add(int element) { - // TODO: please implement me + ensureCapacityInternal(size + 1); + elementData[size++] = element; } @Override public boolean add(int element, int index) { - // TODO: please implement me + if (index <= size && index >= 0) { + ensureCapacityInternal(size + 1); + System.arraycopy(elementData, index, elementData, index + 1, + size - index); + elementData[index] = element; + size++; + return true; + } return false; } @Override public boolean remove(int index) { - // TODO: please implement me + for (int i = 0; i < size; i++) + if (index == i) { + fastRemove(i); + return true; + } return false; } + + private void fastRemove(int index) { + int numMoved = size - index - 1; + if (numMoved > 0) + System.arraycopy(elementData, index + 1, elementData, index, + numMoved); + elementData[--size] = 0; + } + + private void ensureCapacityInternal(int minCapacity) { + if (elementData.length == INITIAL_ARRAY_SIZE) { + minCapacity = Math.max(INITIAL_ARRAY_SIZE, minCapacity); + } + + ensureExplicitCapacity(minCapacity); + } + + private void ensureExplicitCapacity(int minCapacity) { + // overflow-conscious code + if (minCapacity - elementData.length > 0) + grow(minCapacity); + } + + private void grow(int minCapacity) { + // overflow-conscious code + int oldCapacity = elementData.length; + int newCapacity = oldCapacity + (oldCapacity >> 1); + if (newCapacity - minCapacity < 0) + newCapacity = minCapacity; + if (newCapacity - MAX_ARRAY_SIZE > 0) + newCapacity = hugeCapacity(minCapacity); + elementData = Arrays.copyOf(elementData, newCapacity); + } + + private static int hugeCapacity(int minCapacity) { + if (minCapacity < 0) // overflow + throw new OutOfMemoryError(); + return (minCapacity > MAX_ARRAY_SIZE) ? + Integer.MAX_VALUE : + MAX_ARRAY_SIZE; + } } diff --git a/src/main/java/school/lemon/changerequest/java/extendedinteger/ExtendedInteger.java b/src/main/java/school/lemon/changerequest/java/extendedinteger/ExtendedInteger.java index a76f6fe..981035b 100644 --- a/src/main/java/school/lemon/changerequest/java/extendedinteger/ExtendedInteger.java +++ b/src/main/java/school/lemon/changerequest/java/extendedinteger/ExtendedInteger.java @@ -1,119 +1,163 @@ package school.lemon.changerequest.java.extendedinteger; + /** * Integer representation with some additional features */ public class ExtendedInteger { + private int value; public ExtendedInteger(int value) { - //TODO: implement me + this.value = value; } /** * Check whether specified value is even + * * @param value to check * @return true if value is even, false - otherwise */ public static boolean isEven(int value) { - //TODO: implement me + if (value % 2 == 0) { + return true; + } return false; } /** * Check whether specified value is odd + * * @param value to check * @return true if value is odd, false - otherwise */ public static boolean isOdd(int value) { - //TODO: implement me + if (value % 2 != 0) { + return true; + } return false; } /** * Check whether specified value is prime + * * @param value to check * @return true if value is prime, false - otherwise */ public static boolean isPrime(int value) { - //TODO: implement me + int i; + if (value > 1) { + for (i = 2; i <= value / 2; i++) { + if (value % i == 0) { + return false; + } + } + return true; + } return false; } /** * Parse specified char array and create instance of {@code ExtendedInteger} + * * @param value to parse * @return instance of {@code ExtendedInteger} or * null in case specified value is null or the value does not contain a parsable integer */ public static ExtendedInteger parseInt(char[] value) { - //TODO: implement me + if (value.length != 0 && value != null) { + char firstChar = value[0]; + int negative = 1; + int result = 0; + + if (firstChar == "-".charAt(0)) { + negative = -1; + } else if (firstChar == "+".charAt(0)) { + } else if (Character.isDigit(firstChar)) { + result = Character.getNumericValue(value[0]); + } else return null; + + for (int i = 1; i < value.length; i++) { + if (Character.isDigit(value[i])) { + int prevInt = result; + result = prevInt * 10 + Character.getNumericValue(value[i]); + } else return null; + } + return new ExtendedInteger(new Integer(negative*result)); + } return null; } /** * Parse specified string and create instance of {@code ExtendedInteger} + * * @param value to parse * @return instance of {@code ExtendedInteger} or * null in case specified value is null or the value does not contain a parsable integer */ public static ExtendedInteger parseInt(String value) { - //TODO: implement me - return null; + return parseInt(value.toCharArray()); } /** * Get int representation of {@code ExtendedInteger} + * * @return int representation */ public int getValue() { - //TODO: implement me - return 0; + return value; } /** * Check whether current value is even + * * @return true if value is even, false - otherwise */ public boolean isEven() { - //TODO: implement me - return false; + return isEven(value); } /** * Check whether current value is odd + * * @return true if value is odd, false - otherwise */ public boolean isOdd() { - //TODO: implement me - return false; + return isOdd(value); } /** * Check whether current value is prime + * * @return true if value is prime, false - otherwise */ public boolean isPrime() { - //TODO: implement me - return false; + return isPrime(value); } /** * Check whether current {@code ExtendedInteger} is equal to specified int value + * * @return true if values are equal, false - otherwise */ public boolean equals(int value) { - //TODO: implement me + if (this.value == value) { + return true; + } return false; } - /** - * Check whether current {@code ExtendedInteger} is equal to specified object - * @return true if values are equal, false - otherwise - */ @Override - public boolean equals(Object obj) { - //TODO: implement me - return false; + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ExtendedInteger that = (ExtendedInteger) o; + + return value == that.value; } + @Override + public int hashCode() { + return value; + } } diff --git a/src/main/java/school/lemon/changerequest/java/vehicles/Airplane.java b/src/main/java/school/lemon/changerequest/java/vehicles/Airplane.java new file mode 100644 index 0000000..d4bc7fd --- /dev/null +++ b/src/main/java/school/lemon/changerequest/java/vehicles/Airplane.java @@ -0,0 +1,58 @@ +package school.lemon.changerequest.java.vehicles; + +/** + * Created by akliuieva on 29.06.17. + */ +public class Airplane extends Vehicle implements IAirplane{ + private int maximumHeightFeet; + + public Airplane(int manufacturedYear, String make, String model, int maximumHeightFeet) { + super(manufacturedYear, make, model); + this.maximumHeightFeet = maximumHeightFeet; + } + + @Override + public int getMaximumHeightFeet() { + return maximumHeightFeet; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Airplane airplane = (Airplane) o; + + return Math.abs(maximumHeightFeet - airplane.maximumHeightFeet) <= 1000; + } + + @Override + public String toString() { + return "This airplane is a " + getManufacturedYear() + " " + getMake() + " " + getModel() + " that can reach "+getMaximumHeightFeet()+" feet."; + } + + @Override + public int hashCode() { + return maximumHeightFeet; + } + + @Override + public void setMaximumHeightFeet(int maximumHeightFeet) { + this.maximumHeightFeet = maximumHeightFeet; + } + + @Override + public String accelerate() { + return "fire engines on wings"; + } + + @Override + public String steerLeft() { + return "lift wing flaps to turn left"; + } + + @Override + public String steerRight() { + return "lift wing flaps to turn right"; + } +} diff --git a/src/main/java/school/lemon/changerequest/java/vehicles/Boat.java b/src/main/java/school/lemon/changerequest/java/vehicles/Boat.java new file mode 100644 index 0000000..4cb81ed --- /dev/null +++ b/src/main/java/school/lemon/changerequest/java/vehicles/Boat.java @@ -0,0 +1,64 @@ +package school.lemon.changerequest.java.vehicles; + +/** + * Created by akliuieva on 29.06.17. + */ +public class Boat extends Vehicle implements IBoat{ + private boolean motorized; + + public Boat(int manufacturedYear, String make, String model, boolean motorized) { + super(manufacturedYear, make, model); + this.motorized = motorized; + } + + @Override + public String accelerate() { + return "jet water"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Boat boat = (Boat) o; + + return motorized == boat.motorized; + } + + @Override + public String toString() { + if(isMotorized()){ + return "This boat is a "+getManufacturedYear()+" "+getMake()+" "+getModel()+" (with motor)."; + } + else{ + return "This boat is a "+getManufacturedYear()+" "+getMake()+" "+getModel()+"."; + } + } + + @Override + public int hashCode() { + return (motorized ? 1 : 0); + } + + @Override + + public String steerLeft() { + return "turn tiller left"; + } + + @Override + public String steerRight() { + return "turn tiller right"; + } + + @Override + public boolean isMotorized() { + return motorized; + } + + @Override + public void setMotorized(boolean motorized) { + this.motorized = motorized; + } +} diff --git a/src/main/java/school/lemon/changerequest/java/vehicles/Car.java b/src/main/java/school/lemon/changerequest/java/vehicles/Car.java new file mode 100644 index 0000000..bcc7211 --- /dev/null +++ b/src/main/java/school/lemon/changerequest/java/vehicles/Car.java @@ -0,0 +1,58 @@ +package school.lemon.changerequest.java.vehicles; + +/** + * Created by akliuieva on 29.06.17. + */ +public class Car extends Vehicle implements ICar{ + private int horsepower; + + public Car(int manufacturedYear, String make, String model, int horsepower) { + super(manufacturedYear, make, model); + this.horsepower = horsepower; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Car car = (Car) o; + + return Math.abs(horsepower - car.horsepower) <= 10; + } + + @Override + public String toString() { + return "This car is a " + getManufacturedYear() + " " + getMake() + " " + getModel() + " with " + getHorsepower() + " hp."; + } + + @Override + public int hashCode() { + return horsepower; + } + + @Override + public String accelerate() { + return "fire pistons, turn wheels"; + } + + @Override + public String steerLeft() { + return "turn wheels left"; + } + + @Override + public String steerRight() { + return "turn wheels right"; + } + + @Override + public int getHorsepower() { + return horsepower; + } + + @Override + public void setHorsepower(int horsepower) { + this.horsepower = horsepower; + } +} diff --git a/src/main/java/school/lemon/changerequest/java/vehicles/Vehicle.java b/src/main/java/school/lemon/changerequest/java/vehicles/Vehicle.java new file mode 100644 index 0000000..9e8108c --- /dev/null +++ b/src/main/java/school/lemon/changerequest/java/vehicles/Vehicle.java @@ -0,0 +1,47 @@ +package school.lemon.changerequest.java.vehicles; + +/** + * Created by akliuieva on 29.06.17. + */ +public abstract class Vehicle implements IVehicle { + + private int manufacturedYear; + private String make; + private String model; + + public Vehicle(int manufacturedYear, String make, String model) { + this.manufacturedYear = manufacturedYear; + this.make = make; + this.model = model; + } + + @Override + public int getManufacturedYear() { + return manufacturedYear; + } + + @Override + public void setManufacturedYear(int year) { + this.manufacturedYear = year; + } + + @Override + public String getMake() { + return make; + } + + @Override + public void setMake(String make) { + this.make = make; + } + + @Override + public String getModel() { + return model; + } + + @Override + public void setModel(String model) { + this.model = model; + } +} diff --git a/src/main/java/school/lemon/changerequest/java/vehicles/VehicleFactory.java b/src/main/java/school/lemon/changerequest/java/vehicles/VehicleFactory.java index 7856f45..9ed2b24 100644 --- a/src/main/java/school/lemon/changerequest/java/vehicles/VehicleFactory.java +++ b/src/main/java/school/lemon/changerequest/java/vehicles/VehicleFactory.java @@ -14,8 +14,7 @@ private VehicleFactory() { * @return instance of car */ public static ICar createCar(int manufacturedYear, String make, String model, int horsepower) { - // TODO: please implement me - return null; + return new Car(manufacturedYear,make,model, horsepower); } /** @@ -27,8 +26,7 @@ public static ICar createCar(int manufacturedYear, String make, String model, in * @return instance of airplane */ public static IAirplane createAirplane(int manufacturedYear, String make, String model, int maximumHeightFeet) { - // TODO: please implement me - return null; + return new Airplane(manufacturedYear, make, model, maximumHeightFeet); } /** @@ -40,8 +38,7 @@ public static IAirplane createAirplane(int manufacturedYear, String make, String * @return instance of boat */ public static IBoat createBoat(int manufacturedYear, String make, String model, boolean motorized) { - // TODO: please implement me - return null; + return new Boat(manufacturedYear, make, model, motorized); } } From bb72be51dabd82b29ce33c3a698bebc14b84b57d Mon Sep 17 00:00:00 2001 From: Anna Klueva Date: Wed, 5 Jul 2017 16:29:48 +0300 Subject: [PATCH 2/2] Changes according code review-1 --- .../java/container/ContainerImpl.java | 61 +++++++------------ .../java/extendedinteger/ExtendedInteger.java | 16 ++--- .../changerequest/java/vehicles/Airplane.java | 5 +- .../changerequest/java/vehicles/Boat.java | 8 +-- .../changerequest/java/vehicles/Car.java | 5 +- 5 files changed, 40 insertions(+), 55 deletions(-) diff --git a/src/main/java/school/lemon/changerequest/java/container/ContainerImpl.java b/src/main/java/school/lemon/changerequest/java/container/ContainerImpl.java index d66366f..2cb04cf 100644 --- a/src/main/java/school/lemon/changerequest/java/container/ContainerImpl.java +++ b/src/main/java/school/lemon/changerequest/java/container/ContainerImpl.java @@ -3,10 +3,16 @@ import java.util.Arrays; public class ContainerImpl implements Container { + /** + * The maximum size of array to allocate. + * Some VMs reserve some header words in an array. + * Attempts to allocate larger arrays may result in + * OutOfMemoryError: Requested array size exceeds VM limit + */ private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; private int size; - transient int[] elementData; + private int[] elementData; public ContainerImpl() { this.elementData = new int[INITIAL_ARRAY_SIZE]; @@ -19,7 +25,6 @@ public int size() { @Override public void clear() { - // clear to let GC do its work for (int i = 0; i < size; i++) elementData[i] = 0; @@ -28,7 +33,7 @@ public void clear() { @Override public Integer get(int index) { - if (index >= size){ + if (index >= size) { return null; } return elementData[index]; @@ -38,6 +43,7 @@ public Integer get(int index) { public void add(int element) { ensureCapacityInternal(size + 1); elementData[size++] = element; + } @Override @@ -55,49 +61,28 @@ public boolean add(int element, int index) { @Override public boolean remove(int index) { - for (int i = 0; i < size; i++) - if (index == i) { - fastRemove(i); - return true; - } + if (index < size && index >= 0) { + int numMoved = size - index - 1; + if (numMoved > 0) + System.arraycopy(elementData, index + 1, elementData, index, + numMoved); + elementData[--size] = 0; + return true; + } return false; } - private void fastRemove(int index) { - int numMoved = size - index - 1; - if (numMoved > 0) - System.arraycopy(elementData, index + 1, elementData, index, - numMoved); - elementData[--size] = 0; - } - private void ensureCapacityInternal(int minCapacity) { - if (elementData.length == INITIAL_ARRAY_SIZE) { - minCapacity = Math.max(INITIAL_ARRAY_SIZE, minCapacity); + if (minCapacity >= INITIAL_ARRAY_SIZE) { + if (minCapacity - MAX_ARRAY_SIZE > 0) { + minCapacity = hugeCapacity(minCapacity); + } + elementData = Arrays.copyOf(elementData, minCapacity); } - - ensureExplicitCapacity(minCapacity); - } - - private void ensureExplicitCapacity(int minCapacity) { - // overflow-conscious code - if (minCapacity - elementData.length > 0) - grow(minCapacity); - } - - private void grow(int minCapacity) { - // overflow-conscious code - int oldCapacity = elementData.length; - int newCapacity = oldCapacity + (oldCapacity >> 1); - if (newCapacity - minCapacity < 0) - newCapacity = minCapacity; - if (newCapacity - MAX_ARRAY_SIZE > 0) - newCapacity = hugeCapacity(minCapacity); - elementData = Arrays.copyOf(elementData, newCapacity); } private static int hugeCapacity(int minCapacity) { - if (minCapacity < 0) // overflow + if (minCapacity < 0) throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : diff --git a/src/main/java/school/lemon/changerequest/java/extendedinteger/ExtendedInteger.java b/src/main/java/school/lemon/changerequest/java/extendedinteger/ExtendedInteger.java index 981035b..3f90b8c 100644 --- a/src/main/java/school/lemon/changerequest/java/extendedinteger/ExtendedInteger.java +++ b/src/main/java/school/lemon/changerequest/java/extendedinteger/ExtendedInteger.java @@ -44,9 +44,8 @@ public static boolean isOdd(int value) { * @return true if value is prime, false - otherwise */ public static boolean isPrime(int value) { - int i; if (value > 1) { - for (i = 2; i <= value / 2; i++) { + for (int i = 2; i <= value/2; i++) { if (value % i == 0) { return false; } @@ -64,14 +63,15 @@ public static boolean isPrime(int value) { * null in case specified value is null or the value does not contain a parsable integer */ public static ExtendedInteger parseInt(char[] value) { - if (value.length != 0 && value != null) { + if ( !(value.length == 0 || value == null) ) { char firstChar = value[0]; - int negative = 1; + boolean isNegative = false; int result = 0; - if (firstChar == "-".charAt(0)) { - negative = -1; - } else if (firstChar == "+".charAt(0)) { + if (firstChar == '-') { + isNegative = true; + } else if (firstChar == '+') { + isNegative = false; } else if (Character.isDigit(firstChar)) { result = Character.getNumericValue(value[0]); } else return null; @@ -82,7 +82,7 @@ public static ExtendedInteger parseInt(char[] value) { result = prevInt * 10 + Character.getNumericValue(value[i]); } else return null; } - return new ExtendedInteger(new Integer(negative*result)); + return isNegative ? new ExtendedInteger(new Integer((-1)*result)):new ExtendedInteger(new Integer(result)); } return null; } diff --git a/src/main/java/school/lemon/changerequest/java/vehicles/Airplane.java b/src/main/java/school/lemon/changerequest/java/vehicles/Airplane.java index d4bc7fd..78b0ec2 100644 --- a/src/main/java/school/lemon/changerequest/java/vehicles/Airplane.java +++ b/src/main/java/school/lemon/changerequest/java/vehicles/Airplane.java @@ -4,6 +4,7 @@ * Created by akliuieva on 29.06.17. */ public class Airplane extends Vehicle implements IAirplane{ + private int DEFAULT_VALUE_FOR_HASHCODE = 12; //is used to satisfy equals+hashCode contract private int maximumHeightFeet; public Airplane(int manufacturedYear, String make, String model, int maximumHeightFeet) { @@ -19,7 +20,7 @@ public int getMaximumHeightFeet() { @Override public boolean equals(Object o) { if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (!(o instanceof Airplane)) return false; Airplane airplane = (Airplane) o; @@ -33,7 +34,7 @@ public String toString() { @Override public int hashCode() { - return maximumHeightFeet; + return DEFAULT_VALUE_FOR_HASHCODE; } @Override diff --git a/src/main/java/school/lemon/changerequest/java/vehicles/Boat.java b/src/main/java/school/lemon/changerequest/java/vehicles/Boat.java index 4cb81ed..02bfd1e 100644 --- a/src/main/java/school/lemon/changerequest/java/vehicles/Boat.java +++ b/src/main/java/school/lemon/changerequest/java/vehicles/Boat.java @@ -4,6 +4,7 @@ * Created by akliuieva on 29.06.17. */ public class Boat extends Vehicle implements IBoat{ + private int DEFAULT_VALUE_FOR_HASHCODE = 11; //is used to satisfy equals+hashCode contract private boolean motorized; public Boat(int manufacturedYear, String make, String model, boolean motorized) { @@ -19,7 +20,7 @@ public String accelerate() { @Override public boolean equals(Object o) { if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (!(o instanceof Boat)) return false; Boat boat = (Boat) o; @@ -37,12 +38,9 @@ public String toString() { } @Override - public int hashCode() { - return (motorized ? 1 : 0); - } + public int hashCode() { return DEFAULT_VALUE_FOR_HASHCODE; } @Override - public String steerLeft() { return "turn tiller left"; } diff --git a/src/main/java/school/lemon/changerequest/java/vehicles/Car.java b/src/main/java/school/lemon/changerequest/java/vehicles/Car.java index bcc7211..69ed42e 100644 --- a/src/main/java/school/lemon/changerequest/java/vehicles/Car.java +++ b/src/main/java/school/lemon/changerequest/java/vehicles/Car.java @@ -4,6 +4,7 @@ * Created by akliuieva on 29.06.17. */ public class Car extends Vehicle implements ICar{ + private int DEFAULT_VALUE_FOR_HASHCODE = 10; //is used to satisfy equals+hashCode contract private int horsepower; public Car(int manufacturedYear, String make, String model, int horsepower) { @@ -14,7 +15,7 @@ public Car(int manufacturedYear, String make, String model, int horsepower) { @Override public boolean equals(Object o) { if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (!(o instanceof Car)) return false; Car car = (Car) o; @@ -28,7 +29,7 @@ public String toString() { @Override public int hashCode() { - return horsepower; + return DEFAULT_VALUE_FOR_HASHCODE; } @Override