ยูทิลิตี 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐานอาร์เรย์ 2 มิติและการวนซ้ำแบบซ้อนกัน
- อาร์เรย์แบบแถวความยาวต่างกันและการจัดรูปแบบตาราง
- ค่าสูงสุดรายแถว/คอลัมน์ การสลับแถวคอลัมน์ และการจัดรูปแบบ
- โครงงานขนาดเล็ก 2 มิติ: สมุดบันทึกคะแนน
- ยูทิลิตี 2 มิติในคลาสตัวช่วย (ปรับโครงสร้างโค้ด)
- การทำความสะอาดและตรวจสอบข้อมูล 2 มิติ