作业总结
知识点get
- stream
- max
- sorted
- mapToInt
- StringJoiner
- 递归
- jdk 1.8新特性
- lambda 表达式
- 命名规范和代码重构
代码
异常类
package exception;
public class ParkingLotFullException extends RuntimeException {
public ParkingLotFullException(String str) {
super(str);
}
}
package exception;
public class VoucherException extends RuntimeException{
public VoucherException(String str) {
super(str);
}
}
实体类
public class Car {
public Car() {
}
}
public class Voucher {
public Voucher() {
}
}
import exception.ParkingLotFullException;
import exception.VoucherException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.StringJoiner;
public class ParkingLot implements Report {
protected final int CAPACITY;
protected final HashMap<Voucher, Car> voucherCarHashMap;
public int parkingLotCapacity() {
return CAPACITY - voucherCarHashMap.size();
}
public int emptyRate(){
return parkingLotCapacity()/CAPACITY;
}
public ParkingLot(int capacity) {
CAPACITY = capacity;
voucherCarHashMap = new HashMap<>(capacity);
}
public Voucher saveCar(Car car) {
if (haveSpace()) {
Voucher voucher = new Voucher();
voucherCarHashMap.put(voucher, car);
return voucher;
}
throw new ParkingLotFullException("存取车位失败");
}
public boolean haveSpace() {
return voucherCarHashMap.size() < CAPACITY;
}
public Car pickUpCar(Voucher voucher) {
if (haveCar(voucher)) {
return voucherCarHashMap.remove(voucher);
}
throw new VoucherException("凭证失效");
}
public boolean haveCar(Voucher voucher) {
return voucherCarHashMap.containsKey(voucher);
}
@Override
public String getType() {
return "P";
}
@Override
public Integer getParkingQuantity() {
return voucherCarHashMap.size();
}
@Override
public Integer getAllCapacity() {
return CAPACITY;
}
@Override
public List<Report> getChildren() {
return new ArrayList<>();
}
}
import exception.ParkingLotFullException;
import exception.VoucherException;
import java.util.*;
import java.util.stream.Stream;
public class ParkingLotBoy implements SaveAndPickUp,Report{
protected final ArrayList<ParkingLot> parkingLots;
public ParkingLotBoy(ParkingLot ... parkingLots) {
Objects.requireNonNull(parkingLots);
this.parkingLots =new ArrayList<>(Arrays.asList(parkingLots));
}
@Override
public Voucher saveCar(Car car) {
return getAvailableParkingLot()
.orElseThrow(()->new ParkingLotFullException("所有停车场已满,无法停车!"))
.saveCar(car);
}
public Optional<ParkingLot> getAvailableParkingLot() {
return getParkingLotStream().filter(ParkingLot::haveSpace).findFirst();
}
public Stream<ParkingLot> getParkingLotStream() {
return parkingLots.stream();
}
@Override
public Car pickUpCar(Voucher voucher) {
return parkingLots.stream()
.filter(parkingLot -> parkingLot.haveCar(voucher))
.findFirst()
.orElseThrow(()->new VoucherException("凭据失效,无法停车"))
.pickUpCar(voucher);
}
public boolean hasVoucherParkingLot(Voucher voucher){
return parkingLots.stream().anyMatch(parkingLot ->parkingLot.haveCar(voucher));
}
@Override
public String getType() {
return "B";
}
@Override
public Integer getParkingQuantity() {
return parkingLots.stream().mapToInt(ParkingLot->ParkingLot.voucherCarHashMap.size()).sum();
}
@Override
public Integer getAllCapacity() {
return parkingLots.stream().mapToInt(ParkingLot-> ParkingLot.CAPACITY).sum();
}
@Override
public List<Report> getChildren() {
return new ArrayList<>(parkingLots);
}
}
import exception.ParkingLotFullException;
import exception.VoucherException;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class ParkingLotManager extends ParkingLotBoy implements Report{
private ArrayList<ParkingLotBoy> parkingLotBoys;
public ParkingLotManager(ParkingLot... parkingLots) {
super(parkingLots);
}
public void parkingLotManager(ParkingLotBoy...parkingLotBoys) {
Objects.requireNonNull(parkingLotBoys);
this.parkingLotBoys = new ArrayList<>(Arrays.asList(parkingLotBoys));
}
@Override
public Optional<ParkingLot> getAvailableParkingLot() {
Optional<ParkingLot> availablePark = super.getAvailableParkingLot();
if (availablePark.isPresent()) {
return availablePark;
}
for (ParkingLotBoy boy : parkingLotBoys) {
Optional<ParkingLot> parkingLot = boy.getAvailableParkingLot();
if (parkingLot.isPresent()) {
return parkingLot;
}
}
throw new ParkingLotFullException("停车场已满");
}
@Override
public Car pickUpCar(Voucher voucher) {
Optional<ParkingLot> parkingManagerParkLot = parkingLots.stream()
.filter(parkingLot -> parkingLot.haveCar(voucher)).findFirst();
if (parkingManagerParkLot.isPresent()) {
return parkingManagerParkLot.get().pickUpCar(voucher);
}
return parkingLotBoys.stream().filter(parkingBoy -> parkingBoy.hasVoucherParkingLot(voucher))
.findFirst()
.orElseThrow(()->new VoucherException("停车场无该车辆")).pickUpCar(voucher);
}
@Override
public String getType() {
return "M";
}
@Override
public Integer getParkingQuantity() {
return super.getParkingQuantity()+parkingLotBoys.stream().mapToInt(ParkingLotBoy-> ParkingLotBoy.getParkingQuantity()).sum();
}
@Override
public Integer getAllCapacity() {
return super.getAllCapacity()+parkingLotBoys.stream().mapToInt(ParkingLotBoy->ParkingLotBoy.getAllCapacity()).sum();
}
@Override
public List<Report> getChildren() {
return Stream.concat(parkingLots.stream(),parkingLotBoys.stream()).collect(Collectors.toList());
}
}
import exception.ParkingLotFullException;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
public class SmartParkingLotBoy extends ParkingLotBoy{
public SmartParkingLotBoy(ParkingLot... parkingLots) {
super(parkingLots);
}
@Override
public Optional<ParkingLot> getAvailableParkingLot() {
return getParkingLotStream()
.sorted((parkingLotFirst, parkingLotSecond)
-> -((parkingLotFirst.parkingLotCapacity()) - (parkingLotSecond.parkingLotCapacity())))
.filter(ParkingLot::haveSpace).findFirst();
}
}
import java.util.Comparator;
import java.util.Optional;
public class SuperParingBoy extends ParkingLotBoy{
public SuperParingBoy(ParkingLot... parkingLots) {
super(parkingLots);
}
@Override
public Optional<ParkingLot> getAvailableParkingLot() {
return getParkingLotStream().filter(ParkingLot-> ParkingLot.haveSpace())
.max(Comparator.comparing(ParkingLot ->ParkingLot.emptyRate()));
}
}
接口
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringJoiner;
public interface Report {
public default String getReport(){
return getReport(0);
}
public default String getReport(int level){
StringJoiner printReport = new StringJoiner("\n");
String prefix=String.join("", Collections.nCopies(level," "));
String suffix=String.join(" ",getType(),Integer.toString(getParkingQuantity()),Integer.toString(getAllCapacity()));
printReport.add(prefix+suffix);
getChildren().forEach(ParkingLot ->printReport.add(ParkingLot.getReport(level+1)));
return printReport.toString();
}
public String getType();
public Integer getParkingQuantity();
public Integer getAllCapacity();
public List<Report> getChildren();
}
public interface SaveAndPickUp {
public Voucher saveCar(Car car);
public Car pickUpCar(Voucher voucher);
}
测试类
import exception.ParkingLotFullException;
import exception.VoucherException;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class ParkingLotTest {
@Test
public void should_not_save_car_when_parkingLot_is_full() {
ParkingLot parkingLot = new ParkingLot(0);
Car car = new Car();
Car car1 = new Car();
assertThrows(ParkingLotFullException.class, ()->{
parkingLot.saveCar(car);
parkingLot.saveCar(car1);
});
}
@Test
public void should_save_car_when_the_parkingLot_has_place() {
ParkingLot parkingLot = new ParkingLot(2);
Car car = new Car();
Voucher voucher = parkingLot.saveCar(car);
assertEquals(car, parkingLot.pickUpCar(voucher));
}
@Test
public void should_pick_up_the_car_when_voucher_is_effective() {
ParkingLot parkingLot=new ParkingLot(5);
Car car=new Car();
Voucher voucher1 = parkingLot.saveCar(car);
assertEquals(car, parkingLot.pickUpCar(voucher1));
}
@Test
public void should_not_pick_up_the_car_when_voucher_is_invalid() {
ParkingLot parkingLot=new ParkingLot(3);
Car car=new Car();
Voucher voucher1 = parkingLot.saveCar(car);
Voucher voucher=new Voucher();
assertThrows(VoucherException.class, ()->{
parkingLot.pickUpCar(voucher);
});
}
@Test
public void reportPrintShow(){
ParkingLot parkingLot = new ParkingLot(5);
parkingLot.saveCar(new Car());
parkingLot.saveCar(new Car());
assertEquals("P 2 5",parkingLot.getReport());
}
}
import exception.ParkingLotFullException;
import exception.VoucherException;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class ParingLotBoyTest extends ParkingLotTest{
protected ParkingLotBoy buildParkingLotBoy(ParkingLot... parkingLots) {
return new ParkingLotBoy(parkingLots);
}
@Test
public void should_save_car_when_parkingLot_is_not_full(){
ParkingLot parkingLotFirst = new ParkingLot(0);
ParkingLot parkingLotSecond = new ParkingLot(1);
ParkingLot parkingLotThird = new ParkingLot(2);
ParkingLotBoy parkingLotBoy = buildParkingLotBoy(parkingLotFirst, parkingLotSecond, parkingLotThird);
parkingLotBoy.saveCar(new Car());
parkingLotBoy.saveCar(new Car());
assertEquals(false, parkingLotSecond.haveSpace());
assertEquals(true, parkingLotThird.haveSpace());
}
@Test
public void should_not_save_car_when_parkingLot_is_full(){
ParkingLotBoy parkingLotBoy =new ParkingLotBoy(new ParkingLot(0),new ParkingLot(0),new ParkingLot(1));
assertThrows(ParkingLotFullException.class, ()->{
parkingLotBoy.saveCar(new Car());
parkingLotBoy.saveCar(new Car());
});
}
@Test
public void should_pick_up_car_when_voucher_is_effective() {
ParkingLot parkingLotFirst = new ParkingLot(2);
ParkingLot parkingLotSecond = new ParkingLot(2);
ParkingLotBoy parkingLotBoy = new ParkingLotBoy(parkingLotFirst,parkingLotSecond);
Car car = new Car();
Voucher voucher = parkingLotBoy.saveCar(car);
assertEquals(car, parkingLotBoy.pickUpCar(voucher));
}
@Test
public void should_not_pickUp_car_when_voucher_is_invalid(){
ParkingLot parkingLot = new ParkingLot(2);
ParkingLotBoy parkingLotBoy = new ParkingLotBoy(parkingLot);
Car car = new Car();
Voucher voucher = new Voucher();
assertThrows(VoucherException.class, ()->{
parkingLotBoy.pickUpCar(voucher);
});
}
@Test
public void reportPrintShow(){
ParkingLot parkingLotFirst = new ParkingLot(2);
ParkingLot parkingLotSecond = new ParkingLot(2);
ParkingLotBoy parkingLotBoy = new ParkingLotBoy(parkingLotFirst,parkingLotSecond);
parkingLotBoy.saveCar(new Car());
parkingLotBoy.saveCar(new Car());
assertEquals("B 2 4"+"\n"+" P 2 2"+"\n"+" P 0 2",parkingLotBoy.getReport());
}
}
import exception.ParkingLotFullException;
import exception.VoucherException;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class ParingLotManagerTest {
@Test
public void paringLotManager_should_save_car_when_his_parkingLot_is_not_full(){
Car car = new Car();
ParkingLot firstPark = new ParkingLot(0);
ParkingLot secondPark = new ParkingLot(1);
ParkingLot thirdPark = new ParkingLot(3);
ParkingLotManager parkingBoy=new ParkingLotManager(firstPark,secondPark,thirdPark);
Voucher voucher = parkingBoy.saveCar(car);
assertFalse(secondPark.haveSpace());
assertEquals(3,thirdPark.parkingLotCapacity());
}
@Test
public void parkingManager_should_save_car_when_his_parkingLot_is_full(){
Car car = new Car();
ParkingLot firstPark = new ParkingLot(0);
ParkingLot secondPark = new ParkingLot(1);
ParkingLot fourthPark = new ParkingLot(4);
ParkingLot thirdPark = new ParkingLot(3);
ParkingLotManager parkingManager=new ParkingLotManager(firstPark);
parkingManager.parkingLotManager(new SmartParkingLotBoy(secondPark, fourthPark), new ParkingLotBoy(thirdPark));
Voucher voucher = parkingManager.saveCar(car);
assertTrue(secondPark.haveSpace());
assertEquals(3,thirdPark.parkingLotCapacity());
}
@Test
public void parkingManager_should_not_save_car_when_all_park_is_full(){
ParkingLotManager parkingManager=new ParkingLotManager(new ParkingLot(0));
parkingManager.parkingLotManager(new SmartParkingLotBoy(new ParkingLot(0)),new ParkingLotBoy(new ParkingLot(0)));
Assertions.assertThrows(ParkingLotFullException.class, ()->parkingManager.saveCar(new Car()));
}
@Test
public void parkingManager_pick_one_car_when_voucher_is_ture(){
Car car=new Car();
ParkingLot firstPark = new ParkingLot(0);
ParkingLot secondPark = new ParkingLot(0);
ParkingLot thirdPark = new ParkingLot(3);
ParkingLotManager parkingManager=new ParkingLotManager(firstPark);
parkingManager.parkingLotManager(new SmartParkingLotBoy(secondPark),new ParkingLotBoy(thirdPark));
Voucher voucher = parkingManager.saveCar(car);
Assertions.assertEquals(car, parkingManager.pickUpCar(voucher));
}
@Test
public void parkingManager_pick_up_car_of_himself_parkingLot_when_voucher_is_ture(){
Car car=new Car();
ParkingLotManager parkingManager=new ParkingLotManager(new ParkingLot(2));
parkingManager.parkingLotManager(new SmartParkingLotBoy(new ParkingLot(3)),new ParkingLotBoy(new ParkingLot(2)));
Voucher voucher = parkingManager.saveCar(car);
Assertions.assertEquals(car, parkingManager.pickUpCar(voucher));
}
@Test
public void parkingManager_pick_one_car_when_voucher_is_false(){
ParkingLotManager parkingManager=new ParkingLotManager(new ParkingLot(0));
parkingManager.parkingLotManager(new SmartParkingLotBoy(new ParkingLot(0)),new ParkingLotBoy(new ParkingLot(0)));
Assertions.assertThrows(VoucherException.class, () ->parkingManager.pickUpCar(new Voucher()));
}
@Test
public void reportPrintShow(){
ParkingLot firstPark = new ParkingLot(3);
ParkingLot secondPark = new ParkingLot(0);
ParkingLot thirdPark = new ParkingLot(3);
ParkingLotBoy parkingLotBoy = new ParkingLotBoy(new ParkingLot(1));
ParkingLotManager parkingManager=new ParkingLotManager(firstPark);
parkingManager.parkingLotManager(new SmartParkingLotBoy(secondPark),new ParkingLotBoy(thirdPark));
parkingManager.saveCar(new Car());
parkingManager.saveCar(new Car());
parkingManager.saveCar(new Car());
parkingManager.saveCar(new Car());
System.out.println(parkingManager.getReport());
assertEquals(
"M 4 6\n" +
" P 3 3\n" +
" B 0 0\n" +
" P 0 0\n" +
" B 1 3\n" +
" P 1 3",parkingManager.getReport());
}
}
import exception.ParkingLotFullException;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class SmartParkingLotBoyTest extends ParingLotBoyTest {
@Override
protected ParkingLotBoy buildParkingLotBoy(ParkingLot... parkingLots) {
return new SmartParkingLotBoy(parkingLots);
}
@Test
public void should_save_car_when_parkingLot_hava_max(){
ParkingLot parkingLotFirst = new ParkingLot(1);
ParkingLot parkingLotSecond = new ParkingLot(3);
ParkingLot parkingLotThird = new ParkingLot(3);
SmartParkingLotBoy smartParkingLotBoy = new SmartParkingLotBoy(parkingLotFirst,parkingLotSecond,parkingLotThird);
Car car = new Car();
Voucher voucher = smartParkingLotBoy.saveCar(car);
assertTrue(parkingLotThird.haveSpace());
assertEquals(car, parkingLotSecond.pickUpCar(voucher));
}
@Test
public void should_not_save_car_when_parkingLot_is_Full(){
ParkingLot parkingLotFirst = new ParkingLot(0);
SmartParkingLotBoy smartParkingLotBoy = new SmartParkingLotBoy(parkingLotFirst);
assertThrows(ParkingLotFullException.class, ()->{
smartParkingLotBoy.saveCar(new Car());
});
}
}
import exception.ParkingLotFullException;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class SuperParingBoyTest extends SmartParkingLotBoyTest{
@Override
protected ParkingLotBoy buildParkingLotBoy(ParkingLot... parkingLots) {
return new SuperParingBoy(parkingLots);
}
@Test
public void should_parking_car_in_emptyRate_max_when_parkingLot_is_Not_Full(){
ParkingLot parkingLotFirst = new ParkingLot(2);
ParkingLot parkingLotSecond = new ParkingLot(1);
ParkingLot parkingLotThird = new ParkingLot(3);
SuperParingBoy superParingBoy = new SuperParingBoy(parkingLotFirst, parkingLotSecond, parkingLotThird);
superParingBoy.saveCar(new Car());
superParingBoy.saveCar(new Car());
assertEquals(1/2,parkingLotFirst.emptyRate());
assertEquals(0,parkingLotSecond.emptyRate());
assertFalse(parkingLotSecond.haveSpace());
}
}