עבור לתוכן

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

Featured Replies

פורסם

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

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

משהו כזה




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 בלילה.

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

פורסם

מה אתה עוד רוצה? כבר נתנו לך (sharonbn) פתרון כמעט מלא לבעיה...

פורסם
  • מחבר

אוקיי יש לי הארכה וכמעט וסיימתי אבל יש לי בעיה קטנה שאני לא מוצא, בסופו של דבר השתמשתי בשיטה הרגילה של הרבה 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 הציע.

פורסם
  • מחבר

לא כ"כ הבנתי מה ש-sharonbn הציע אז ניסיתי משהו אחר.

אתה אמרת לבדוק מקרים ספציפיים עם הרבה if ושאין דרך יותר מחוכמת לעשות את זה

פורסם

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

לדוגמה, להשתמש בשני משתנים (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...
}

פורסם
  • מחבר

אוקיי תודה אני אנסה אבל בנתיים יש מצב לעזרה עם הבעיה שלי ?

פורסם

איזו עוד עזרה אתה צריך? כבר נתנו לך את הקוד ה(כמעט) מלא.

פורסם
  • מחבר

אני מתכוון לבעיה אצלי בקוד

אני רוצה להבין מה הבעיה שם (java.lang.ArrayIndexOutOfBoundsException: 3)

פורסם

בדיוק כמו השם של השגיאה - חרגת מגבולות המערך. אחת מהגישות שלך יוצאת מהגבול של המערך.

חוץ מזה, אין שום היגיון ב-if-ים שלך ובסדר שלהם.

פורסם
  • מחבר

הסתדרתי בסוף תודה.

ארכיון

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

דיונים חדשים