0Pricing
Java Academy · บทเรียน

ยูทิลิตี 2 มิติในคลาสตัวช่วย (ปรับโครงสร้างโค้ด)

ปรับโครงสร้างโค้ดตรรกะ 2 มิติที่ซ้ำกันให้เป็นตัวช่วยที่นำกลับมาใช้ได้ เปิดให้ใช้ยูทิลิตี static สำหรับความกว้าง การพิมพ์ให้ตรงแนว ค่าเฉลี่ย ค่าสูงสุด และทรานสโพส จากนั้นเรียกใช้ตัวช่วยในตัวอย่างขนาดเล็ก

ยูทิลิตี 2 มิติในคลาสตัวช่วย (ปรับโครงสร้างโค้ด) เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 5 จากทั้งหมด 6 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 6 บทเรียน

เหตุผลที่ต้องปรับโครงสร้าง

เหตุใดจึงควรปรับโครงสร้างเป็นตัวช่วย เพื่อหลีกเลี่ยงการคัดลอกแล้ววาง รักษาแหล่งข้อมูลจริงเพียงแห่งเดียว และทำให้บทเรียนถัดไปง่ายขึ้น เราจะสร้างตัวช่วย GradeUtil ที่มีเมธอดสแตติกสำหรับความกว้าง การพิมพ์ให้จัดแนว ค่าเฉลี่ย ค่าสูงสุด และการสลับแถวกับคอลัมน์

โครงสร้างตัวช่วยและการพิมพ์

สร้าง GradeUtil แบบสแตติกพร้อมความกว้างและ printAligned จากนั้นเรียก GradeUtil.printAligned(m) จาก main เพื่อพิมพ์เมทริกซ์แบบแต่ละแถวมีความยาวต่างกันให้คอลัมน์ตรงกันได้ทุกแบบ

public class Main {
  // Static helper with reusable utilities for 2D int matrices
  static class GradeUtil {
    // Compute per-column widths (jagged-aware)
    static int[] widths(int[][] m) {
      int maxCols = 0;
      for (int r = 0; r < m.length; r = r + 1) if (m[r].length > maxCols) maxCols = m[r].length;
      int[] w = new int[maxCols];
      for (int r = 0; r < m.length; r = r + 1) {
        for (int c = 0; c < m[r].length; c = c + 1) {
          int len = Integer.toString(m[r][c]).length();
          if (len > w[c]) w[c] = len;
        }
      }
      for (int c = 0; c < w.length; c = c + 1) if (w[c] < 1) w[c] = 1;
      return w;
    }

    // Print matrix with aligned columns
    static void printAligned(int[][] m) {
      int[] w = widths(m);
      for (int r = 0; r < m.length; r = r + 1) {
        String line = "";
        for (int c = 0; c < m[r].length; c = c + 1) {
          String s = Integer.toString(m[r][c]);
          while (s.length() < w[c]) s = " " + s;
          line = line + s + (c + 1 < m[r].length ? " " : "");
        }
        System.out.println(line);
      }
    }
  }

  public static void main(String[] args) {
    // Demo: build a small jagged matrix and print it via the helper
    int[][] m = {
      {1, 23, 456},
      {7, 8},
      {90, 12, 3, 4}
    };
    System.out.println("Aligned print via GradeUtil:");
    GradeUtil.printAligned(m);
  }
}

ตัวช่วยคำนวณค่าเฉลี่ย

เพิ่ม rowAverage และ colAverage ลงในตัวช่วย แล้วเรียกใช้จาก main ค่าเฉลี่ยของคอลัมน์ต้องตรวจสอบความยาวของแต่ละแถวเพื่อรองรับอาร์เรย์ที่แต่ละแถวมีความยาวต่างกันอย่างปลอดภัย

public class Main {
  static class GradeUtil {
    static double rowAverage(int[][] g, int r) {
      int sum = 0;
      for (int c = 0; c < g[r].length; c = c + 1) sum = sum + g[r][c];
      return (double) sum / g[r].length;
    }
    static double colAverage(int[][] g, int c) {
      int sum = 0;
      int count = 0;
      for (int r = 0; r < g.length; r = r + 1) {
        if (c < g[r].length) { sum = sum + g[r][c]; count = count + 1; }
      }
      return (double) sum / count;
    }
  }

  public static void main(String[] args) {
    int[][] g = {
      {78, 85, 90, 88, 92},
      {95, 91, 89, 93, 87},
      {60, 72, 70, 68, 75},
      {88, 84, 79, 85, 90}
    };

    // Use helper to compute row averages
    for (int r = 0; r < g.length; r = r + 1) {
      double avg = GradeUtil.rowAverage(g, r);
      System.out.println("student " + r + " avg = " + String.format("%.2f", avg));
    }

    // Use helper to compute column averages
    for (int c = 0; c < g[0].length; c = c + 1) {
      double avg = GradeUtil.colAverage(g, c);
      System.out.println("assignment " + c + " avg = " + String.format("%.2f", avg));
    }
  }
}

ตัวช่วยสลับแถวกับคอลัมน์

สร้างการสลับแถวกับคอลัมน์สำหรับเมทริกซ์แบบสี่เหลี่ยมผืนผ้าและเมทริกซ์ที่แต่ละแถวมีความยาวต่างกัน เวอร์ชันที่แต่ละแถวมีความยาวต่างกันจะสร้างแถวสำหรับดัชนีคอลัมน์แต่ละตำแหน่ง และเติมศูนย์ในรายการที่ขาดหาย

public class Main {
  static class GradeUtil {
    // Transpose rectangular matrix (R x C) -> (C x R)
    static int[][] transposeRect(int[][] m) {
      int rows = m.length;
      int cols = m[0].length;
      int[][] t = new int[cols][rows];
      for (int r = 0; r < rows; r = r + 1) {
        for (int c = 0; c < cols; c = c + 1) t[c][r] = m[r][c];
      }
      return t;
    }
    // Jagged-safe transpose (pads with 0)
    static int[][] transposeJagged(int[][] m) {
      int maxCols = 0;
      for (int r = 0; r < m.length; r = r + 1) if (m[r].length > maxCols) maxCols = m[r].length;
      int[][] t = new int[maxCols][];
      for (int c = 0; c < maxCols; c = c + 1) {
        t[c] = new int[m.length];
        for (int r = 0; r < m.length; r = r + 1) t[c][r] = (c < m[r].length) ? m[r][c] : 0;
      }
      return t;
    }
  }

  public static void main(String[] args) {
    int[][] rect = {
      {1, 2, 3},
      {4, 5, 6}
    };
    int[][] t = GradeUtil.transposeRect(rect);
    System.out.println("t[0][1] should be 2: " + t[0][1]);

    int[][] jag = {
      {9, 12, 7},
      {5},
      {8, 10}
    };
    int[][] tj = GradeUtil.transposeJagged(jag);
    System.out.println("tj[1][0] should be 12: " + tj[1][0]);
  }
}

ตัวช่วยหาค่าสูงสุดของคอลัมน์

เปิดให้ใช้ colMaxima เพื่อคำนวณค่าสูงสุดของแต่ละคอลัมน์ โดยจัดการแถวที่มีความยาวต่างกันอย่างปลอดภัย ใช้ตัวบ่งชี้ว่าพบข้อมูลแล้วเพื่อหลีกเลี่ยงค่าต่ำสุดเทียมเมื่อคอลัมน์นั้นว่าง

public class Main {
  static class GradeUtil {
    // Column maxima for a jagged matrix
    static int[] colMaxima(int[][] m) {
      int maxCols = 0;
      for (int r = 0; r < m.length; r = r + 1) if (m[r].length > maxCols) maxCols = m[r].length;
      int[] max = new int[maxCols];
      for (int c = 0; c < maxCols; c = c + 1) {
        int best = Integer.MIN_VALUE;
        boolean seen = false;
        for (int r = 0; r < m.length; r = r + 1) {
          if (c < m[r].length) {
            if (!seen || m[r][c] > best) { best = m[r][c]; seen = true; }
          }
        }
        max[c] = seen ? best : 0;
      }
      return max;
    }
  }

  public static void main(String[] args) {
    int[][] jag = {
      {9, 12, 7},
      {5},
      {8, 10}
    };
    int[] cm = GradeUtil.colMaxima(jag);
    System.out.print("col maxima: ");
    for (int i = 0; i < cm.length; i = i + 1) System.out.print(cm[i] + (i + 1 < cm.length ? " " : ""));
    System.out.println();
  }
}

รวมเครื่องมือทั้งหมดเข้าด้วยกัน

รวมเครื่องมือต่าง ๆ ไว้ในตัวช่วยเดียว และควบคุมการทำงานจาก main เพียงแห่งเดียว ได้แก่ การพิมพ์ ค่าเฉลี่ย การสลับแถวกับคอลัมน์ และค่าสูงสุดของคอลัมน์ นี่คือชุดเครื่องมือที่นำกลับมาใช้ซ้ำได้สำหรับบทเรียนถัดไป

public class Main {
  static class GradeUtil {
    static int[] widths(int[][] m) {
      int maxCols = 0;
      for (int r = 0; r < m.length; r = r + 1) if (m[r].length > maxCols) maxCols = m[r].length;
      int[] w = new int[maxCols];
      for (int r = 0; r < m.length; r = r + 1) {
        for (int c = 0; c < m[r].length; c = c + 1) {
          int len = Integer.toString(m[r][c]).length();
          if (len > w[c]) w[c] = len;
        }
      }
      for (int c = 0; c < w.length; c = c + 1) if (w[c] < 1) w[c] = 1;
      return w;
    }
    static void printAligned(int[][] m) {
      int[] w = widths(m);
      for (int r = 0; r < m.length; r = r + 1) {
        String line = "";
        for (int c = 0; c < m[r].length; c = c + 1) {
          String s = Integer.toString(m[r][c]);
          while (s.length() < w[c]) s = " " + s;
          line = line + s + (c + 1 < m[r].length ? " " : "");
        }
        System.out.println(line);
      }
    }
    static double rowAverage(int[][] g, int r) {
      int sum = 0; for (int c = 0; c < g[r].length; c = c + 1) sum = sum + g[r][c];
      return (double) sum / g[r].length;
    }
    static double colAverage(int[][] g, int c) {
      int sum = 0; int count = 0;
      for (int r = 0; r < g.length; r = r + 1) { if (c < g[r].length) { sum = sum + g[r][c]; count = count + 1; } }
      return (double) sum / count;
    }
    static int[][] transposeRect(int[][] m) {
      int rows = m.length; int cols = m[0].length; int[][] t = new int[cols][rows];
      for (int r = 0; r < rows; r = r + 1) for (int c = 0; c < cols; c = c + 1) t[c][r] = m[r][c];
      return t;
    }
    static int[][] transposeJagged(int[][] m) {
      int maxCols = 0; for (int r = 0; r < m.length; r = r + 1) if (m[r].length > maxCols) maxCols = m[r].length;
      int[][] t = new int[maxCols][];
      for (int c = 0; c < maxCols; c = c + 1) { t[c] = new int[m.length]; for (int r = 0; r < m.length; r = r + 1) t[c][r] = (c < m[r].length) ? m[r][c] : 0; }
      return t;
    }
    static int[] colMaxima(int[][] m) {
      int maxCols = 0; for (int r = 0; r < m.length; r = r + 1) if (m[r].length > maxCols) maxCols = m[r].length;
      int[] max = new int[maxCols];
      for (int c = 0; c < maxCols; c = c + 1) {
        int best = Integer.MIN_VALUE; boolean seen = false;
        for (int r = 0; r < m.length; r = r + 1) if (c < m[r].length) { if (!seen || m[r][c] > best) { best = m[r][c]; seen = true; } }
        max[c] = seen ? best : 0;
      }
      return max;
    }
  }

  public static void main(String[] args) {
    int[][] g = {
      {78, 85, 90, 88, 92},
      {95, 91, 89, 93, 87},
      {60, 72, 70, 68, 75},
      {88, 84, 79, 85, 90}
    };

    System.out.println("Original gradebook:");
    GradeUtil.printAligned(g);

    System.out.println("Row averages:");
    for (int r = 0; r < g.length; r = r + 1) System.out.println(r + ": " + String.format("%.2f", GradeUtil.rowAverage(g, r)));

    System.out.println("Column averages:");
    for (int c = 0; c < g[0].length; c = c + 1) System.out.println(c + ": " + String.format("%.2f", GradeUtil.colAverage(g, c)));

    System.out.println("Transpose (rect):");
    GradeUtil.printAligned(GradeUtil.transposeRect(g));

    System.out.println("Column maxima:");
    int[] cm = GradeUtil.colMaxima(g);
    for (int i = 0; i < cm.length; i = i + 1) System.out.print(cm[i] + (i + 1 < cm.length ? " " : ""));
    System.out.println();
  }
}

ตรวจสอบการเรียกแบบสแตติก

ตรวจสอบอย่างรวดเร็ว: คุณจะเรียกใช้ตัวช่วยแบบสแตติกที่พิมพ์เมทริกซ์ได้อย่างไร

สรุปทบทวนและขั้นถัดไป

สรุปทบทวน: คุณได้ปรับโครงสร้างการดำเนินการทั่วไปกับข้อมูลสองมิติให้เป็นตัวช่วย GradeUtil และนำไปใช้จากตัวอย่างสาธิตหลายรายการ ทำให้โค้ดสั้น อ่านง่าย และสอดคล้องกันในทุกบทเรียน

คำถามที่พบบ่อย

บทเรียน “ยูทิลิตี 2 มิติในคลาสตัวช่วย (ปรับโครงสร้างโค้ด)” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ยูทิลิตี 2 มิติในคลาสตัวช่วย (ปรับโครงสร้างโค้ด)” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 6 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ยูทิลิตี 2 มิติในคลาสตัวช่วย (ปรับโครงสร้างโค้ด)”

ปรับโครงสร้างโค้ดตรรกะ 2 มิติที่ซ้ำกันให้เป็นตัวช่วยที่นำกลับมาใช้ได้ เปิดให้ใช้ยูทิลิตี static สำหรับความกว้าง การพิมพ์ให้ตรงแนว ค่าเฉลี่ย ค่าสูงสุด และทรานสโพส จากนั้นเรียกใช้ตัวช่วยในตัวอย่างขนาดเ… คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 5 จากทั้งหมด 6 บทเรียน

บทเรียน “ยูทิลิตี 2 มิติในคลาสตัวช่วย (ปรับโครงสร้างโค้ด)” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐานอาร์เรย์ 2 มิติและการวนซ้ำแบบซ้อนกัน
  2. อาร์เรย์แบบแถวความยาวต่างกันและการจัดรูปแบบตาราง
  3. ค่าสูงสุดรายแถว/คอลัมน์ การสลับแถวคอลัมน์ และการจัดรูปแบบ
  4. โครงงานขนาดเล็ก 2 มิติ: สมุดบันทึกคะแนน
  5. ยูทิลิตี 2 มิติในคลาสตัวช่วย (ปรับโครงสร้างโค้ด)
  6. การทำความสะอาดและตรวจสอบข้อมูล 2 มิติ
← กลับไปที่ Java Academy