أدوات ثنائية الأبعاد كفئة مساعدة (إعادة الهيكلة)
أعد هيكلة المنطق الثنائي الأبعاد المتكرر في أداة مساعدة قابلة لإعادة الاستخدام. وفّر أدوات static لحساب العروض، والطباعة بمحاذاة صحيحة، والمتوسطات، والقيم الكبرى، والتحويل المنقول. استخدم الأداة المساعدة من عروض توضيحية صغيرة.
أدوات ثنائية الأبعاد كفئة مساعدة (إعادة الهيكلة) درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 5 من أصل 6. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 6 دروس في المجموع.
لماذا إعادة الهيكلة
لماذا نعيد الهيكلة في أداة مساعدة؟ لتجنّب النسخ واللصق، والحفاظ على مصدر واحد للحقيقة، وتبسيط الدروس اللاحقة. سننشئ أداة GradeUtil المساعدة باستخدام دوال static للأحجام، والطباعة بمحاذاة متناسقة، والمتوسطات، والقيم العظمى، والنقل.
هيكل الأداة المساعدة والطباعة
أنشئوا أداة GradeUtil باستخدام دوال static هما widths وprintAligned. ثم استدعوا من main الدالة GradeUtil.printAligned(m) لطباعة أي مصفوفة متفاوتة الأطوال بأعمدة مصطفة.
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));
}
}
}
أدوات النقل
نفّذوا transpose للمصفوفات المستطيلة والمصفوفات متفاوتة الأطوال. ينشئ الإصدار الخاص بالمصفوفات متفاوتة الأطوال صفوفًا لكل فهرس عمود، ويملأ المدخلات المفقودة بالقيمة صفر.
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 لحساب القيمة العظمى لكل عمود، مع التعامل بأمان مع الصفوف متفاوتة الأطوال. استخدموا علامة seen لتجنّب القيم الدنيا الوهمية عندما يكون العمود فارغًا.
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();
}
}
التحقق من الاستدعاء الثابت
تحقق سريع: كيف تستدعون أداة مساعدة static تطبع مصفوفة؟
مراجعة والخطوة التالية
مراجعة: أعدتم هيكلة العمليات الشائعة على المصفوفات ثنائية الأبعاد داخل أداة GradeUtil المساعدة، واستخدمتموها من عروض توضيحية متعددة. يحافظ ذلك على صغر الشيفرة ووضوحها واتساقها عبر الدروس.
الأسئلة الشائعة
هل درس «أدوات ثنائية الأبعاد كفئة مساعدة (إعادة الهيكلة)» مجاني؟
نعم — نص درس «أدوات ثنائية الأبعاد كفئة مساعدة (إعادة الهيكلة)» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 6 دروس في المجموع.
ماذا ستتعلم في «أدوات ثنائية الأبعاد كفئة مساعدة (إعادة الهيكلة)»؟
أعد هيكلة المنطق الثنائي الأبعاد المتكرر في أداة مساعدة قابلة لإعادة الاستخدام. وفّر أدوات static لحساب العروض، والطباعة بمحاذاة صحيحة، والمتوسطات، والقيم الكبرى، والتحويل المنقول. استخدم الأداة المس… تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 5 من أصل 6.
كم من الوقت يستغرق درس «أدوات ثنائية الأبعاد كفئة مساعدة (إعادة الهيكلة)»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات المصفوفات ثنائية الأبعاد والتكرار المتداخل
- المصفوفات متباينة الأطوال وتنسيق الجداول
- القيم الكبرى للصفوف والأعمدة، والتحويل، والتنسيق
- مشروع مصغّر ثنائي الأبعاد: سجل الدرجات
- أدوات ثنائية الأبعاد كفئة مساعدة (إعادة الهيكلة)
- تنظيف البيانات ثنائية الأبعاد والتحقّق منها