עזרה במתודה ב-Java - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

עזרה במתודה ב-Java


gshhar

Recommended Posts

ישנה אפשרות להוסיף מעט "אלגנטיות" לפתרון

במקום לשאול אם תא יושב בקצוות, לשאול "מסביב" (שמונה תאים שכנים) לכל התאים ופשוט לשאול האם האינדקס של השכן עובר את גבולות המטריצה

משהו כזה




public class Test
{
public static final int ROW_SIZE = 10;
public static final int COL_SIZE = 10;


public static void main (String[] args)
{
int[][] arr = new int[COL_SIZE][ROW_SIZE];

for (int i_col = 0 ; i_col < COL_SIZE ; i_col++) {
for (int i_row = 0 ; i_row < ROW_SIZE ; i_row++) {
// x__
// _*_
// ___
int i_neighbor_col = i_col-1;
int i_neighbor_row = i_row-1;
if (validCell(i_neighbor_col, i_neighbor_row)) {
// process arr[i_neighbor_col][i_neighbor_row]
}
// _x_
// _*_
// ___
i_neighbor_col = i_col-1;
i_neighbor_row = i_row;
if (validCell(i_neighbor_col, i_neighbor_row)) {
// process arr[i_neighbor_col][i_neighbor_row]
}
// ...
}
}
}

public static boolean validCell (int i_col, int i_row)
{
return i_col >= 0 && i_row >= 0 && i_col < COL_SIZE && i_row < ROW_SIZE;
}

קישור לתוכן
שתף באתרים אחרים

אז בדיוק אותו דבר במערך דו מימדי רק שיש שכנים בקואורדינטת ה-i ושכנים בקואורדינטת ה-j.

לתא במיקום [j] יש שכנים במקום ה-[i-1][j], [j-1], [i+1][j+1] וכולי... חוץ מאשר בקצוות כאשר i ו-j שווים לתחילת המערך או לסופו.

לא כ"כ הבנתי את ההסבר ואני יושב על זה עכשיו וחייב להגיש את התרגיל עד 12 בלילה.

מה שיש לי זה מערך דו מימדי ואני צריך להחזיר מערך חדש כאשר כל תא הוא הממוצע שלו עם כל התאים השכנים.

קישור לתוכן
שתף באתרים אחרים

אוקיי יש לי הארכה וכמעט וסיימתי אבל יש לי בעיה קטנה שאני לא מוצא, בסופו של דבר השתמשתי בשיטה הרגילה של הרבה if

חילקתי את זה ל-3:

כאשר אני נמצא בשורה הראשונה של המערך שלי

כאשר אני נמצא בכל השורות האמצעיות

כאשר אני נמצא בשורה האחרונה

_array

- זהו המערך הדו מימדי שלי שעליו אני אמור לחשב את כל החישובים של התאים

int[][] arr = new int[_array.length][_array.length];

- המערך החדש שאני אמור להחזיר.

בקוד שלי עדיין לא התייחסתי למצב שבו אני נמצא בשורה האחרונה של המערך.


public myArray imageFilterAverage()
{
int[][] arr = new int[_array.length][_array.length];

for (int i = 0; i < _array.length; i++)
{
for (int j = 0; j < _array[i].length; j++)
{
if (i == 0 && j == 0)
{
arr[i][j] = (_array[i][j] + _array[i + 1][j] + _array[i][j + 1] + _array[i + 1][j + 1]) / 4;
}
else if(i > 0 && i < _array.length)
{
arr[i][j] = (_array[i][j] + _array[i - 1][j] + _array[i + 1][j] + _array[i - 1][j + 1] + _array[i][j + 1] + _array[i + 1][j + 1]) / 6;
}
else if(j == 0 && i == _array.length)
{
arr[i][j] = (_array[i][j] + _array[i - 1][j] + _array[i][j + 1] + _array[i - 1][j + 1]) / 4;
}
else if (j > 0 && j < _array[i].length)
{
if (i == 0)
{
arr[i][j] = (_array[i][j] + _array[i][j - 1] + _array[i + 1][j - 1] + _array[i + 1][j] + _array[i][j + 1] + _array[i + 1][j + 1]) / 6;
}
else if (i == _array.length)
{
arr[i][j] = (_array[i][j] + _array[i - 1][j - 1] + _array[i][j - 1] + _array[i - 1][j] + _array[i - 1][j + 1] + _array[i][j + 1]) / 6;
}
else
{
arr[i][j] = (_array[i][j] + _array[i - 1][j - 1] + _array[i - 1][j] + _array[i - 1][j + 1] + _array[i - 1][j] + _array[i + 1][j] +
_array[i - 1][j + 1] + _array[i ][j + 1] + _array[i + 1][j + 1]) / 8;
}
}
}
}

return new myArray(arr);
}

המערך שלי שעליו אני עובד:


int[][] arr = {
{0, 1, 2},
{3, 4, 5},
{6, 7, 8}
};

הבעיה שלי היא שגיאה שאני לא מצליח למצוא ב-if האחרון בקוד, אשמח אם מישהו יעיר את צומת ליבי לבעיה.

קישור לתוכן
שתף באתרים אחרים

אאוץ', כואב לי לראות את הקוד שלך...

מה רע במה ש-sharonbn הציע?

למקרה שלא הבנת, זה מה שאתה אמור לעשות:

for (... i ...) {
for (... j ...) {
arr[i][j] = calculate(i,j);
}
}

double calculate(int row, int col)
{
double sum = 0;
double count = 0;
for (int i = row-1 ; i<= row+1; i++) {
for (int j = col-1 ; j <= col+1 ; j++) {
if (isvalid(i,j)) {
sum += _array[i][j];
count++;
}
}
}
return sum / count;
}

והפונקציה isvalid צריכה להיות כמו ש-sharonbn הציע.

קישור לתוכן
שתף באתרים אחרים

גם את המקרים הספציפיים היה אפשר לעשות בצורה יותר חכמה, בלי שכפול קוד מטורף.

לדוגמה, להשתמש בשני משתנים (sum ו-count) ואז באמצעות ifים להוסיף להם, יענו משהו בסגנון הזה:

if (i>0) {
if (j>0) {
sum += _array[i-1][j-1];
count++;
}
if (j < length-1) {
sum += _array[i-1][j+1];
count++;
}
sum += _array[i-1][j];
count++;
}
if (i < length-1) {
// ... rest of the checks...
}

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...