永别了牢笼

作业总结

知识点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));
    }


    /**
     * 存车
     * @param car
     * @return voucher
     */
    @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();
    }


    /**
     *  取车
     * @param voucher
     * @return car
     */


    @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);
    }
    /**
     * 1、有空间 2、容量不能为零
     */
    @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){
    
    
    //打印自己的 delimiter, prefix, suffix
        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()  {
    
    
        //Given
        ParkingLot parkingLot = new ParkingLot(0);
        //when
        Car car = new Car();
        Car car1 = new Car();
        //then
        assertThrows(ParkingLotFullException.class, ()->{
    
    
                parkingLot.saveCar(car);
                parkingLot.saveCar(car1);
        });
    }
    @Test
    public void  should_save_car_when_the_parkingLot_has_place()  {
    
    
        //Given
        ParkingLot parkingLot = new ParkingLot(2);
        //when
        Car car = new Car();
        Voucher voucher = parkingLot.saveCar(car);
        //then
        assertEquals(car, parkingLot.pickUpCar(voucher));
    }

    @Test
    public void should_pick_up_the_car_when_voucher_is_effective()  {
    
    
        //Given
        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(){
    
    
        //Given
        ParkingLot parkingLotFirst = new ParkingLot(0);
        ParkingLot parkingLotSecond = new ParkingLot(1);
        ParkingLot parkingLotThird = new ParkingLot(2);
        ParkingLotBoy parkingLotBoy = buildParkingLotBoy(parkingLotFirst, parkingLotSecond, parkingLotThird);
        //when
        parkingLotBoy.saveCar(new Car());
        parkingLotBoy.saveCar(new Car());
        //then
        assertEquals(false, parkingLotSecond.haveSpace());
        assertEquals(true, parkingLotThird.haveSpace());
    }


    @Test
    public void  should_not_save_car_when_parkingLot_is_full(){
    
    
        //Given
        ParkingLotBoy parkingLotBoy =new ParkingLotBoy(new ParkingLot(0),new ParkingLot(0),new ParkingLot(1));
        //when then
        assertThrows(ParkingLotFullException.class, ()->{
    
    
            parkingLotBoy.saveCar(new Car());
            parkingLotBoy.saveCar(new Car());
        });
        
    }

    @Test
    public void should_pick_up_car_when_voucher_is_effective()  {
    
    
        //Given
        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);
        //when then
        assertEquals(car, parkingLotBoy.pickUpCar(voucher));
    }

    //凭证无效
    @Test
    public void should_not_pickUp_car_when_voucher_is_invalid(){
    
    
        //Given
        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(){
    
    
        //Given
        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);
        //when
        Voucher voucher = parkingBoy.saveCar(car);
        //then
        assertFalse(secondPark.haveSpace());
        assertEquals(3,thirdPark.parkingLotCapacity());
    }
    @Test
    //停车经理没有空余停车位让停车仔停车
    public void parkingManager_should_save_car_when_his_parkingLot_is_full(){
    
    
        //Given
        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));
        //when
        Voucher voucher = parkingManager.saveCar(car);
        //then
        assertTrue(secondPark.haveSpace());
        assertEquals(3,thirdPark.parkingLotCapacity());
    }
    @Test
    //停车经理以及他管理的停车小弟都没有空余停车位
    public void parkingManager_should_not_save_car_when_all_park_is_full(){
    
    
        //Given
        ParkingLotManager parkingManager=new ParkingLotManager(new ParkingLot(0));
        parkingManager.parkingLotManager(new SmartParkingLotBoy(new ParkingLot(0)),new ParkingLotBoy(new ParkingLot(0)));
        //when//then
        Assertions.assertThrows(ParkingLotFullException.class, ()->parkingManager.saveCar(new Car()));

    }
    @Test
    //停车经理取车,车子在停车仔的停车场
    public void parkingManager_pick_one_car_when_voucher_is_ture(){
    
    
        //Given
        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);
        //when//then
        Assertions.assertEquals(car, parkingManager.pickUpCar(voucher));
    }
    @Test
    //停车经理取车,车子在自己的停车场
    public void parkingManager_pick_up_car_of_himself_parkingLot_when_voucher_is_ture(){
    
    
        //Given
        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);
        //when//then
        Assertions.assertEquals(car, parkingManager.pickUpCar(voucher));
    }

    @Test
    public void parkingManager_pick_one_car_when_voucher_is_false(){
    
    
        //Given
        ParkingLotManager parkingManager=new ParkingLotManager(new ParkingLot(0));
        parkingManager.parkingLotManager(new SmartParkingLotBoy(new ParkingLot(0)),new ParkingLotBoy(new ParkingLot(0)));
        //when//then
        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(){
    
    
        //Given
        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();
        //when
        Voucher voucher = smartParkingLotBoy.saveCar(car);
        //then
        assertTrue(parkingLotThird.haveSpace());
        assertEquals(car, parkingLotSecond.pickUpCar(voucher));
    }

    //无停车位
    @Test
    public void should_not_save_car_when_parkingLot_is_Full(){
    
    
        //Given
        ParkingLot parkingLotFirst = new ParkingLot(0);
        SmartParkingLotBoy smartParkingLotBoy = new SmartParkingLotBoy(parkingLotFirst);
        //when then
        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(){
    
    
        //Given
        ParkingLot parkingLotFirst = new ParkingLot(2);
        ParkingLot parkingLotSecond = new ParkingLot(1);
        ParkingLot parkingLotThird = new ParkingLot(3);
        SuperParingBoy superParingBoy = new SuperParingBoy(parkingLotFirst, parkingLotSecond, parkingLotThird);
        //when
        superParingBoy.saveCar(new Car());
        superParingBoy.saveCar(new Car());
        //then
        assertEquals(1/2,parkingLotFirst.emptyRate());
        assertEquals(0,parkingLotSecond.emptyRate());
        assertFalse(parkingLotSecond.haveSpace());
    }
}

猜你喜欢

转载自blog.csdn.net/AzirBoDa/article/details/126638500
今日推荐