<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      一、前言

      本次pta單部電梯調(diào)度程序分為三次,其中后兩次作業(yè)是在前一次作業(yè)的基礎(chǔ)之上進(jìn)行迭代改進(jìn),因此,第一次作業(yè)就顯得尤為重要,且萬(wàn)事開(kāi)頭難,光是將這個(gè)題目電梯的運(yùn)行邏輯搞清楚要耗費(fèi)不少時(shí)間,而且這個(gè)電梯LOOK算法變種與日常生活中的電梯很不一樣,了解其中運(yùn)行邏輯在開(kāi)始時(shí)相當(dāng)困難,在編寫代碼時(shí)也遇見(jiàn)了許多困難,比如怎么對(duì)輸入的這串字符串進(jìn)行處理,這些數(shù)字,字母,<>怎么去進(jìn)行分割提取,為此學(xué)習(xí)了正則表達(dá)式,List等相關(guān)知識(shí),還有寫的過(guò)程中發(fā)現(xiàn)一些地方的邏輯錯(cuò)誤或者是情況考慮少了等等。而第二、三次都是添加了一些要求也就是對(duì)第一次的代碼進(jìn)行迭代并用面向?qū)ο笤O(shè)計(jì)要求去改進(jìn)完善代碼以及完善算法,處理更多特殊情況之類的。三次題目層序漸進(jìn),環(huán)環(huán)相扣,讓我邊寫邊學(xué)收獲了很多的新知識(shí)。

      二、設(shè)計(jì)與分析

      第一次電梯題目的設(shè)計(jì)與分析

      題目要求:

      設(shè)計(jì)一個(gè)電梯類,包含最大樓層數(shù)、最小樓層數(shù)(默認(rèn)為1層)當(dāng)前樓層、運(yùn)行方向、運(yùn)行狀態(tài),以及電梯內(nèi)部乘客請(qǐng)求隊(duì)列和外部請(qǐng)求隊(duì)列,其中,電梯外部請(qǐng)求隊(duì)列區(qū)分上下行。運(yùn)行規(guī)則:電梯默認(rèn)在1層,狀態(tài)靜止,有乘客發(fā)起請(qǐng)求時(shí)(各樓層電梯外部乘客按下上行或下行按鈕或內(nèi)部乘客按下想要到達(dá)的樓層數(shù)字按鈕),電梯開(kāi)始移動(dòng),當(dāng)電梯向某個(gè)方向移動(dòng)時(shí),優(yōu)先處理同方向請(qǐng)求,當(dāng)同方向請(qǐng)求均被處理完畢再處理相反方向的請(qǐng)求。電梯運(yùn)行過(guò)程中的狀態(tài)包括停止、移動(dòng)中、開(kāi)門、關(guān)門等狀態(tài)。當(dāng)電梯停止時(shí),如果有新請(qǐng)求,就根據(jù)請(qǐng)求方向或位置決定移動(dòng)方向。電梯在運(yùn)行到某一樓層時(shí),檢查當(dāng)前是否有請(qǐng)求(訪問(wèn)電梯內(nèi)請(qǐng)求隊(duì)列和電梯外請(qǐng)求隊(duì)列),然后據(jù)此決定移動(dòng)方向。每次移動(dòng)一個(gè)樓層,檢查是否有需要停靠的請(qǐng)求,如果有,則開(kāi)門,處理該樓層的請(qǐng)求,然后關(guān)門繼續(xù)移動(dòng)。還要注意處理無(wú)效請(qǐng)求情況,比如超過(guò)大樓的最高或最低樓層。

      設(shè)計(jì)類圖:


      其中main類使用正則表達(dá)式來(lái)正確讀取每行輸入當(dāng)中所需的數(shù)據(jù),然后按數(shù)據(jù)的形式來(lái)進(jìn)行外部或者內(nèi)部的請(qǐng)求的加入。Elevator類用來(lái)控制電梯的運(yùn)行,和方向的確定,以及打印電梯當(dāng)前所在的樓層、狀態(tài)和運(yùn)行方向。由于還不會(huì)枚舉,所以用的-1,0,1來(lái)表示電梯的方向向上,靜止還是向下。

      Souce Monitor分析結(jié)果:


      這一次的代碼寫的很糟糕,因?yàn)榭赡蹸語(yǔ)言的設(shè)計(jì)思維還沒(méi)有完全轉(zhuǎn)變過(guò)來(lái),再就是題目難度的忽然升高理解電梯運(yùn)行邏輯等等所花時(shí)間太多了,編寫代碼的時(shí)間就少了很多。

      點(diǎn)擊查看代碼
      import java.util.*;
      public class Main
      {
          static class Elevator
          {
              // 1,0,-1分別表示向上靜止和向下
              private int UP = 1;
              private int IDLE = 0;
              private int DOWN = -1;
              private int minFloor;
              private int maxFloor;
              private int currentFloor;
              private int direction; // 這個(gè)指的是當(dāng)前方向
              private LinkedList<Integer> innerQueue = new LinkedList<>();   //又用LinkedList看看時(shí)間能否減少
              private LinkedList<Integer> outerUpQueue = new LinkedList<>();
              private LinkedList<Integer> outerDownQueue = new LinkedList<>();
              public Elevator(int min, int max)
              {
                  minFloor = min;
                  maxFloor = max;
                  currentFloor = 1; // 初始在1層
                  direction = IDLE;
              }
              // 用于添加內(nèi)部的請(qǐng)求
              void addInner(int floor)
              {
                  if (floor < minFloor || floor > maxFloor)
                      return;
                  innerQueue.add(floor);
              }
              // 添加外部請(qǐng)求
              void addExternalQueue(int floor, String dir)
              {
                  if (floor < minFloor || floor > maxFloor)
                      return;
                  if ("UP".equals(dir))
                  {
                      outerUpQueue.add(floor);
                  } else
                  {
                      outerDownQueue.add(floor);
                  }
              }
              private boolean hasRequest()
              {    // 這個(gè)這個(gè)方法是說(shuō)有沒(méi)有請(qǐng)求<沒(méi)有考慮要不要開(kāi)門>
                  return!innerQueue.isEmpty() ||!outerUpQueue.isEmpty() ||!outerDownQueue.isEmpty();
              }
              // dianti的運(yùn)行
              void runFloor()
              {  setInitialDir();
                System.out.println("Current Floor: " + currentFloor + " Direction: " + getDirName());
                  while (hasRequest()||direction != IDLE)
                  {  // 如果有請(qǐng)求的話
                      // 處理當(dāng)前樓層的請(qǐng)求
                      boolean needOpen = processFloor();
                      if (needOpen)
                      {    // 安裝需要的輸出格式輸出
                          System.out.println("Current Floor: " + currentFloor + " Direction: " + getDirName());
                          System.out.println("Open Door # Floor " + currentFloor);
                          System.out.println("Close Door");
                      } else if (direction != IDLE)
                      {
                          System.out.println("Current Floor: " + currentFloor + " Direction: " + getDirName());
                      }
                      // 判斷要不要轉(zhuǎn)變方向
                      if (needReverse())
                      {
                          reverseDirection();
                      }
                    setInitialDir();
                    moveFloor();
                  }  // 直到?jīng)]有了請(qǐng)求
              }
              // 用于刪除數(shù)組第一個(gè)元素
              private void deleteFirst(LinkedList<Integer> list) {
                  if (!list.isEmpty()) {
                      list.removeFirst();
                  }
              }
              // 處理當(dāng)前樓層請(qǐng)求(只檢查隊(duì)列第一個(gè)元素)
              private boolean processFloor()
              {
                  boolean open = false;
                  // 處理內(nèi)部隊(duì)列
                  if (!innerQueue.isEmpty() && innerQueue.peekFirst() == currentFloor)
                  {
                      deleteFirst(innerQueue);
                      open = true;
                  }
                  // 處理外部隊(duì)列(根據(jù)方向)
                  LinkedList<Integer> externalQueue;
                  if (direction == UP)
                  {
                      externalQueue = outerUpQueue;
                  } else
                  {
                      externalQueue = outerDownQueue;
                  }
                  if (!externalQueue.isEmpty() && externalQueue.get(0) == currentFloor)
                  {
                      if (direction == UP)
                      {
                          deleteFirst(outerUpQueue);
                      } else
                      {
                          deleteFirst(outerDownQueue);
                      }
                      open = true;
                  }
                  return open;
              }
              // 判斷是否需要轉(zhuǎn)變電梯的方向
              private boolean needReverse()
              {
                  if (direction == IDLE)
                      return false;
                  // 檢查當(dāng)前方向是否還有請(qǐng)求
                  boolean hasRequest = false;
                  if (direction == UP)
                  {  // 如果方向向上
                      if (haveQueue(innerQueue, true) || haveQueue(outerUpQueue, true))
                      {   // 如果有內(nèi)部向上或者外部向上的請(qǐng)求
                          hasRequest = true;
                      }
                  } else
                  {
                      if (haveQueue(innerQueue, false) || haveQueue(outerDownQueue, false))
                      {
                          hasRequest = true;
                      }
                  }
                  return!hasRequest;
              }
              // 檢查隊(duì)列中是否有<需要處理>的請(qǐng)求,這個(gè)方法是說(shuō)有沒(méi)有要處理的請(qǐng)求
              private boolean haveQueue(LinkedList<Integer> queue, boolean isUp)
              {
                  for (int floor : queue)
                  {    // forEach循環(huán)
                      if (isUp && floor > currentFloor)
                      {  // 如果電梯向上并且有大于當(dāng)前樓梯的請(qǐng)求
                          return true;
                      }
                      if (!isUp && floor < currentFloor)
                      { // 如果電梯向下并且有小于當(dāng)前樓梯的請(qǐng)求
                          return true;
                      }
                  }
                  return false;   // 其他情況都是false
              }
              // 電梯移動(dòng)一樓
              private void moveFloor()
              {
                  if (direction == UP)
                  {
                      if (currentFloor < maxFloor)
                      { // 如果電梯方向向上并且小于最大樓層
                          currentFloor++;
                      }
                  } else if (direction == DOWN)
                  {
                      if (currentFloor > minFloor)
                      {  // 如果電梯方向向下并且大于最小樓層的華
                          currentFloor--;
                      }
                  } else
                  {
                      setInitialDir();
                  }
              }
              // 用于設(shè)置初始方向
              private void setInitialDir()
              {
                  int firstReq = getFirstRequest();
                  if (firstReq > currentFloor)
                  {
                      direction = UP;
                  } else if (firstReq < currentFloor)
                  {
                      direction = DOWN;
                  }
                else direction = IDLE;
              }
              // 獲取第一個(gè)請(qǐng)求的樓層
              private int getFirstRequest()
              {
                  if (!innerQueue.isEmpty())
                      return innerQueue.getFirst();
                  if (!outerUpQueue.isEmpty())
                      return outerUpQueue.getFirst();
                  if (!outerDownQueue.isEmpty())
                      return outerDownQueue.getFirst();
                  return currentFloor; // 無(wú)請(qǐng)求時(shí)保持當(dāng)前層
              }
              // 調(diào)轉(zhuǎn)方向
              private void reverseDirection()
              {
                  if (direction == UP)
                  {
                      direction = DOWN;
                  } else if (direction == DOWN)
                  {
                      direction = UP;
                  }
                  // 如果調(diào)轉(zhuǎn)后沒(méi)有請(qǐng)求,則靜止
                  if (!haveQueue(innerQueue, direction == UP) &&!haveQueue(innerQueue, direction == DOWN) &&
                      !haveQueue(outerUpQueue, direction == UP) &&!haveQueue(outerUpQueue, direction == DOWN))
                  {
                      // 如果各種請(qǐng)求都沒(méi)有了的華
                      direction = IDLE;
                  }
              }
              // 將方向轉(zhuǎn)換為字符串!差點(diǎn)忘了
              private String getDirName()
              {
                  if (direction == UP)
                      return "UP";
                  if (direction == DOWN)
                      return "DOWN";
                  return "IDLE";
              }
          }
          public static void main(String[] args)
          {
              Scanner input = new Scanner(System.in);
              int min = input.nextInt();
              int max = input.nextInt();
              input.nextLine(); // 讀取換行符
              Elevator elevator = new Elevator(min, max);
              while (true)
              {
                  String line = input.nextLine().trim();
                  if (line.equalsIgnoreCase("end"))
                      break;
                  line = line.replaceAll("[<>\\s]", ""); // 去掉<>和空格
                  if (line.contains(","))
                  {        // 如果包含,那就說(shuō)明是外部的請(qǐng)求
                      String[] parts = line.split(",");
                      int floor = Integer.parseInt(parts[0]);
                      String dir = parts[1].toUpperCase();
                      elevator.addExternalQueue(floor, dir);
                  } else
                  {  // 否則就是內(nèi)部的請(qǐng)求
                      int floor = Integer.parseInt(line);
                      elevator.addInner(floor);
                  }
              }
              elevator.runFloor();
          }
      }
      
      
      我的這次代碼通過(guò)了題目所給出的用例測(cè)試點(diǎn),但是提交顯示運(yùn)行超時(shí)錯(cuò)誤,后來(lái)經(jīng)過(guò)多次各種輸入輸出比對(duì)后發(fā)現(xiàn)了代碼電梯對(duì)于一些特殊情況的處理存在問(wèn)題,比如電梯的停止判定條件模糊導(dǎo)致一些情況下(只有向上/下請(qǐng)求)電梯判定錯(cuò)誤,一直向上或者向下運(yùn)行下去導(dǎo)致運(yùn)行超時(shí),還有電梯對(duì)于一些特殊情況的方向判定也存在著一些問(wèn)題。總之,這次代碼寫的不盡人意,錯(cuò)誤很多,更不必提算法性能啥的了。

      第二次電梯題目的設(shè)計(jì)與分析

      題目要求:

      新增:乘客請(qǐng)求樓層數(shù)有誤,具體為高于最高樓層數(shù)或低于最低樓層數(shù),處理方法:程序自動(dòng)忽略此類輸入,繼續(xù)執(zhí)行。乘客請(qǐng)求不合理,具體為輸入時(shí)出現(xiàn)連續(xù)的相同請(qǐng)求,例如<3><3><3>或者<5,DOWN><5,DOWN>,處理方法:程序自動(dòng)忽略相同的多余輸入,繼續(xù)執(zhí)行,例如<3><3><3>過(guò)濾為<3>,要分成多個(gè)類,并且要遵循單一職責(zé)原則(SRP)。

      設(shè)計(jì)類圖:


      根據(jù)題目所給類圖提示進(jìn)行設(shè)計(jì)Main類用正則表達(dá)式解析輸入數(shù)據(jù)分為電梯內(nèi)部請(qǐng)求和電梯外部請(qǐng)求,分別加入到RequestQueue類的匹配請(qǐng)求隊(duì)列當(dāng)中。Elevator類包含電梯樓層范圍、當(dāng)前樓層、樓層合法性檢驗(yàn)、電梯的運(yùn)行方向和運(yùn)行狀態(tài),用于Controller類的電梯運(yùn)行邏輯。ExterRequest類用來(lái)存儲(chǔ)電梯外部請(qǐng)求的樓層與方向。RequestQueue類包括電梯內(nèi)部外部請(qǐng)求兩個(gè)隊(duì)列,以及添加請(qǐng)求、獲得當(dāng)前請(qǐng)求和檢驗(yàn)請(qǐng)求是否重復(fù)方法,用于Controller類當(dāng)中的電梯運(yùn)行方向分析和判斷。Controller類用來(lái)執(zhí)行電梯的運(yùn)行方向及狀態(tài)判斷、控制電梯的移動(dòng)、完成請(qǐng)求隊(duì)列中的請(qǐng)求和打印當(dāng)前電梯的運(yùn)行狀態(tài)和樓層。

      Souce Monitor分析結(jié)果:


      這一次通過(guò)給出的java類圖對(duì)思路有很大幫助,就像把一個(gè)復(fù)雜的問(wèn)題分成多個(gè)小部分使其簡(jiǎn)單化,同時(shí)對(duì)問(wèn)題出現(xiàn)錯(cuò)誤在哪可以更加容易的找到。這次的代碼寫雖然還是存在一些問(wèn)題,但是以經(jīng)有了很大的進(jìn)步,通過(guò)與其他同學(xué)的測(cè)試結(jié)果比對(duì),我們都發(fā)現(xiàn)了一些問(wèn)題,有時(shí)候問(wèn)題出錯(cuò)很簡(jiǎn)單但是不報(bào)錯(cuò),這種不小心寫錯(cuò)導(dǎo)致的邏輯上的錯(cuò)誤很難發(fā)現(xiàn),再就是仍然是存在某種情況下電梯沒(méi)有停下,這個(gè)當(dāng)時(shí)來(lái)不及改,也不知道是到底哪里出了問(wèn)題,一直被困在這里。

      點(diǎn)擊查看代碼
      import java.util.LinkedList;
      import java.util.Scanner;
      import java.util.Collections;
      import java.util.List;
      
      enum Direction {
          UP, DOWN, IDLE
      }
      
      class ExternalRequest {
          final int floor;
          final Direction direction;
      
          ExternalRequest(int floor, Direction direction) {
              this.floor = floor;
              this.direction = direction;
          }
      }
      
      class RequestQueue {
          private final LinkedList<Integer> internal = new LinkedList<>();
          private final LinkedList<ExternalRequest> external = new LinkedList<>();
      
          void addInternal(int floor) {
              if (internal.isEmpty() || internal.getLast() != floor) {
                  internal.add(floor);
              }
          }
      
          void addExternal(int floor, Direction direction) {
              ExternalRequest newReq = new ExternalRequest(floor, direction);
              if (external.isEmpty() || !isEqual(external.getLast(), newReq)) {
                  external.add(newReq);
              }
          }
      
          private boolean isEqual(ExternalRequest a, ExternalRequest b) {
              return a.floor == b.floor && a.direction == b.direction;
          }
      
          Integer peekInternal() { return internal.peek(); }
          ExternalRequest peekExternal() { return external.peek(); }
          void removeInternal() { internal.poll(); }
          void removeExternal() { external.poll(); }
          boolean isEmpty() { return internal.isEmpty() && external.isEmpty(); }
      
          // 新增訪問(wèn)方法
          List<Integer> getInternalRequests() {
              return new LinkedList<>(internal); // 返回副本
          }
      
          List<ExternalRequest> getExternalRequests() {
              return new LinkedList<>(external); // 返回副本
          }
      }
      
      class Elevator {
          int currentFloor;
          Direction direction = Direction.IDLE;
          final int minFloor;
          final int maxFloor;
      
          Elevator(int minFloor, int maxFloor) {
              this.minFloor = minFloor;
              this.maxFloor = maxFloor;
              this.currentFloor = minFloor;
          }
      
          boolean isValidFloor(int floor) {
              return floor >= minFloor && floor <= maxFloor;
          }
      
          void moveStep() {
              if (direction == Direction.UP) currentFloor++;
              else if (direction == Direction.DOWN) currentFloor--;
          }
      }
      
      public class Main {
          public static void main(String[] args) {
              Scanner scanner = new Scanner(System.in);
              int min = Integer.parseInt(scanner.nextLine());
              int max = Integer.parseInt(scanner.nextLine());
      
              Elevator elevator = new Elevator(min, max);
              RequestQueue queue = new RequestQueue();
      
              // 處理輸入
              String line;
              while (!(line = scanner.nextLine()).equalsIgnoreCase("end")) {
                  line = line.trim().toUpperCase();
                  if (line.matches("<\\d+>")) {
                      int floor = Integer.parseInt(line.replaceAll("[<>]", ""));
                      if (elevator.isValidFloor(floor)) queue.addInternal(floor);
                  } else if (line.matches("<\\d+,\\s*(UP|DOWN)>")) {
                      String[] parts = line.replaceAll("[<>]", "").split(",");
                      int floor = Integer.parseInt(parts[0].trim());
                      Direction dir = Direction.valueOf(parts[1].trim());
                      if (elevator.isValidFloor(floor)) queue.addExternal(floor, dir);
                  }
              }
      
              // 電梯運(yùn)行邏輯
              while (!queue.isEmpty()) {
                  Integer M = queue.peekInternal();
                  ExternalRequest P = queue.peekExternal();
                  int N = elevator.currentFloor;
      
                  // 方向判定
                  if (elevator.direction == Direction.IDLE) {
                      if (M != null) {
                          elevator.direction = M > N ? Direction.UP : Direction.DOWN;
                      } else if (P != null) {
                          elevator.direction = P.floor > N ? Direction.UP : Direction.DOWN;
                      } else {
                          break;
                      }
                      System.out.printf("Current Floor: %d Direction: %s\n", N, elevator.direction);
                  }
      
                  // 執(zhí)行移動(dòng)
                  elevator.moveStep();
                  N = elevator.currentFloor;
                  System.out.printf("Current Floor: %d Direction: %s\n", N, elevator.direction);
      
                  // 檢查停靠
                  boolean stop = false;
                  if (M != null && M == N) {
                      stop = true;
                      queue.removeInternal();
                  }
                  if (P != null && P.floor == N &&
                          (P.direction == elevator.direction || elevator.direction == Direction.IDLE)) {
                      stop = true;
                      queue.removeExternal();
                  }
      
                  if (stop) {
                      System.out.printf("Open Door # Floor %d\n", N);
                      System.out.println("Close Door");
                  }
      
                  // 方向更新邏輯
                  boolean hasSameDirectionRequest = false;
                  List<Integer> internalRequests = queue.getInternalRequests();
                  List<ExternalRequest> externalRequests = queue.getExternalRequests();
      
                  if (elevator.direction == Direction.UP) {
                      // 檢查所有UP方向請(qǐng)求
                      for (Integer m : internalRequests) {
                          if (m > N) {
                              hasSameDirectionRequest = true;
                              break;
                          }
                      }
                      for (ExternalRequest p : externalRequests) {
                          if (p.floor > N && p.direction == Direction.UP) {
                              hasSameDirectionRequest = true;
                              break;
                          }
                      }
                  } else if (elevator.direction == Direction.DOWN) {
                      // 檢查所有DOWN方向請(qǐng)求
                      for (Integer m : internalRequests) {
                          if (m < N) {
                              hasSameDirectionRequest = true;
                              break;
                          }
                      }
                      for (ExternalRequest p : externalRequests) {
                          if (p.floor < N && p.direction == Direction.DOWN) {
                              hasSameDirectionRequest = true;
                              break;
                          }
                      }
                  }
      
                  if (!hasSameDirectionRequest) {
                      // 切換方向檢查反向請(qǐng)求
                      boolean hasReverseRequest = false;
                      if (elevator.direction == Direction.UP) {
                          for (Integer m : internalRequests) {
                              if (m < N) {
                                  hasReverseRequest = true;
                                  break;
                              }
                          }
                          for (ExternalRequest p : externalRequests) {
                              if (p.floor < N && p.direction == Direction.DOWN) {
                                  hasReverseRequest = true;
                                  break;
                              }
                          }
                      } else {
                          for (Integer m : internalRequests) {
                              if (m > N) {
                                  hasReverseRequest = true;
                                  break;
                              }
                          }
                          for (ExternalRequest p : externalRequests) {
                              if (p.floor > N && p.direction == Direction.UP) {
                                  hasReverseRequest = true;
                                  break;
                              }
                          }
                      }
      
                      if (hasReverseRequest) {
                          elevator.direction = elevator.direction == Direction.UP ? Direction.DOWN : Direction.UP;
                      } else {
                          elevator.direction = Direction.IDLE;
                      }
                  }
      
                  // 最終檢查隊(duì)列狀態(tài)
                  if (queue.isEmpty()) {
                      elevator.direction = Direction.IDLE;
                      break;
                  }
              }
          }
      }
      
      

      第三次電梯題目的設(shè)計(jì)與分析

      題目要求:

      對(duì)之前電梯調(diào)度程序再次進(jìn)行迭代性設(shè)計(jì),加入乘客類(Passenger),取消乘客請(qǐng)求類,類設(shè)計(jì)要求遵循單一職責(zé)原則(SRP);乘客請(qǐng)求輸入變動(dòng)情況:外部請(qǐng)求由之前的<請(qǐng)求樓層數(shù),請(qǐng)求方向>修改為<請(qǐng)求源樓層,請(qǐng)求目的樓層>對(duì)于外部請(qǐng)求,當(dāng)電梯處理該請(qǐng)求之后(該請(qǐng)求出隊(duì)),要將<請(qǐng)求源樓層,請(qǐng)求目的樓層>中的請(qǐng)求目的樓層加入到請(qǐng)求內(nèi)部隊(duì)列(加到隊(duì)尾)

      設(shè)計(jì)類圖:


      這次的題目集變化了輸入樓層請(qǐng)求的格式,參考類圖刪除了ExternalRequest類,新增了一個(gè)Passager類。Main類這次用于處理輸入數(shù)據(jù)的正則表達(dá)式要改變,然后這次的某一行數(shù)據(jù)按Passenger類的構(gòu)造方法來(lái)儲(chǔ)存。RequestQueue類中隊(duì)列的類型變?yōu)镻assenger,并且把乘客請(qǐng)求添加到隊(duì)列里方法變?yōu)閭魅隤assenger。Controller類移除請(qǐng)求的方法中要改為在處理完一個(gè)外部請(qǐng)求時(shí)先把外部請(qǐng)求中的樓層加入內(nèi)部請(qǐng)求隊(duì)列隊(duì)尾部分,再移除當(dāng)前這個(gè)外部請(qǐng)求。

      Souce Monitor分析結(jié)果:


      這次題目變化了輸入的格式、類的重新設(shè)計(jì)和邏輯處理情況。我在其中碰到了許多的問(wèn)題,比如在外部請(qǐng)求的刪除和添加到內(nèi)部末尾處有問(wèn)題,還有就是邏輯上的問(wèn)題,由于前一次的電梯問(wèn)題我還沒(méi)有發(fā)現(xiàn),說(shuō)明我可能有情況漏掉了,同樣帶到了這一次的問(wèn)題當(dāng)中。

      三、踩坑心得

      一定要有完整的思路再去開(kāi)始寫代碼

      寫代碼一定要有“全局觀”,我剛開(kāi)始想到什么就寫什么,這樣不僅會(huì)導(dǎo)致情況很可能考慮的不周到,還會(huì)影響編寫其他代碼的思路,最后的結(jié)果就是刪刪改改,可能還會(huì)越改越錯(cuò)。所以一定要謀而后動(dòng)。

      與人溝通很重要

      “他山之玉,可以攻石”,有時(shí)候一個(gè)問(wèn)題你思考了好久都沒(méi)有解決甚至是沒(méi)有頭緒的時(shí)候,別人可能稍稍指點(diǎn)一下就會(huì)解決,團(tuán)隊(duì)協(xié)助,互幫互助非常重要。

      一定要仔細(xì)

      不要盲目的去追求速度,如果速度上去了,因?yàn)榇中拇笠舛{(diào)試找錯(cuò)的時(shí)間成本可能會(huì)大于仔細(xì)認(rèn)真的敲,有時(shí)候一個(gè)中英文輸錯(cuò)&&和||寫錯(cuò)或者大小寫拼寫等等問(wèn)題就很難發(fā)現(xiàn),但又會(huì)影響你全部的代碼。

      第一步很重要

      這次電梯的三次實(shí)驗(yàn),其實(shí)最重要的我覺(jué)得還是第一次對(duì)電梯的理解是否完全是否透徹,我就是由于不知曉某個(gè)情況沒(méi)正確考慮,而導(dǎo)致后續(xù)的作業(yè)一直被影響。所以一定要搞明白設(shè)計(jì)需求,邏輯原理。

      四、改進(jìn)建議

      1.代碼的部分方法邏輯過(guò)于重復(fù)且繁瑣,可將其拆分為多個(gè)方法,這樣不僅能提高代碼的可讀性,也便于進(jìn)行后續(xù)的維護(hù)。
      2.方法盡量做到單一功能,使邏輯更清晰。
      3.在一些可能越界的地方加入判斷更好的檢測(cè)到問(wèn)題出現(xiàn)在哪,快速定位和解決問(wèn)題。
      4.增加代碼的注釋,提高可讀性,不然自己一段時(shí)間后重新看會(huì)很費(fèi)勁,降低效率。特別是復(fù)雜方法邏輯不清晰更要添加注釋。

      五、總結(jié)

      收獲

      通過(guò)這三次迭代性題目集的綜合性學(xué)習(xí),我獲益良多,首先,我對(duì)C語(yǔ)言面對(duì)過(guò)程編程和Java面對(duì)對(duì)象編程的差異有了更多的了解,再就是這三次PTA作業(yè)使我的邏輯思維和編程能力很有幫助。然后在不斷編寫和修改代碼過(guò)程中, 我對(duì)于Java語(yǔ)法掌握、正則表達(dá)式應(yīng)用,List使用以及面向?qū)ο蟮某绦蛟O(shè)計(jì)有了有更加深刻的理解和提升,通過(guò)題目的迭代設(shè)計(jì),如電梯第一個(gè)題目迭代到第二個(gè)題目,我對(duì)于類設(shè)計(jì)的遵循單一職責(zé)原則SRP和類間關(guān)系有了更加深刻的認(rèn)識(shí)。同時(shí)也理解領(lǐng)悟了自身還有很多的不足之處。

      建議

      希望老師發(fā)布新一輪的迭代作業(yè)后對(duì)前一輪的作業(yè)提供一些幫助,比如這次的三輪迭代作業(yè),好多人可能第一次作業(yè)時(shí)沒(méi)有搞懂會(huì)導(dǎo)致后面的都幾乎沒(méi)法做了,還會(huì)影響打擊信心,再就是希望提交后的錯(cuò)誤提示多一點(diǎn),比如第一次的電梯作業(yè)就一個(gè)提示答案錯(cuò)誤70分,還有就是希望迭代作業(yè)起步的時(shí)候能有更多的測(cè)試用例,后面我們對(duì)題目邏輯有一定的理解后就可以自己設(shè)置測(cè)試用例來(lái)找錯(cuò)誤。

      posted on 2025-04-20 16:47  城南舊事A  閱讀(71)  評(píng)論(0)    收藏  舉報(bào)

      主站蜘蛛池模板: 亚洲精品成a人在线观看| 青青草原国产精品啪啪视频| 日产国产一区二区不卡| 国产精品成人中文字幕| 私人毛片免费高清影视院| 久久人妻精品大屁股一区| 亚洲av二区国产精品| 国产精品无码专区| 熟女人妻aⅴ一区二区三区电影| 国产黄色一区二区三区四区| 丰满人妻一区二区三区高清精品| 国产精品va在线观看h| 中文字幕亚洲高清在线一区| 97se亚洲国产综合自在线观看| 无码国内精品人妻少妇| 日本夜爽爽一区二区三区| 国产精品夜夜春夜夜爽久久小| 蜜桃成熟色综合久久av| 平潭县| 亚亚洲视频一区二区三区| 蜜臀av久久国产午夜| 潮喷失禁大喷水无码| 国内熟妇人妻色在线三级| 欧美成人精品三级网站| 四虎永久在线精品无码视频| 国产又色又爽又刺激在线观看| 一区二区三区国产亚洲自拍| 亚洲精品毛片一区二区| 亚洲天堂激情av在线| 亚洲国产欧美在线人成AAAA| 国产av第一次处破| 色综合天天综合天天更新| 国产最大成人亚洲精品| 久久国产免费观看精品3| 国产做爰xxxⅹ久久久精华液| 亚洲国产精品久久无人区| 中文字幕日韩有码国产| 久久无码中文字幕免费影院| 国产肥妇一区二区熟女精品| 亚洲男人在线天堂| 人妻加勒比系列无码专区|