@she3nro

Как найти все чётные числа в двумерном массиве и сохранить их в файл?

Здравствуйте, мне нужно найти все чётные числа в двумерном массиве и сохранить их в файл.
Написал вот такой код, но он не работает. Подскажите, пожалуйста, в чем дело и как исправить?
static void ex6(int[][] A, int n, int m) throws IOException {
       FileWriter fw = new FileWriter("ParCol.txt");
       int[][] posA = new int[n][m];

       for(int i = 0; i < A.length; i++) {
           for(int j = 0; j < A.length; j++) {
               if(A[i][j] % 2 == 0) {
                    posA[i][j] = A[i][j];
               }
           }
       }

       fw.write(n + " " + m + "\n");
       for(int i = 0; i < posA.length; i++) {
           for(int j = 0; j < posA[i].length; j++) {
               fw.write(posA[i][j] + " ");
           }
           fw.write("\n");
       }
}
  • Вопрос задан
  • 139 просмотров
Решения вопроса 1
Bavashi
@Bavashi
Попробуйте так:

Код

import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

public class Main {
	public static void main(String[] args) {
		int[][] a = new int[2][2]; // массив будет заполняться случайными числами, размерность массива можете менять
        Random rnd = new Random();
        for (int i = 0; i < a.length;i++) {
            for (int j = 0; j < a[i].length;j++) {
                a[i][j] = rnd.nextInt(10) + 1;
            }
        }
        for (int i = 0; i < a.length; i++, System.out.println()) {
            for (int j = 0; j < a[i].length; j++) {
                System.out.print(a[i][j] + " ");
            }
        }
		
	    try {
			ex6(a, 2, 2); //вызов метода с передачей сгенерированного массива и параметров
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
	
	static void ex6(int[][] A, int n, int m) throws IOException {
	       FileWriter fw = new FileWriter("ParCol.txt");
	       int[][] posA = new int[n][m];

	       for(int i = 0; i < A.length; i++) {
	           for(int j = 0; j < A[i].length; j++) {
	               if(A[i][j] % 2 == 0) {
	            	   posA[i][j] = A[i][j];
	               }
	           }
	       }

	       fw.write(n + " " + m + "\r\n");
	       for(int i = 0; i < posA.length; i++) {
	           for(int j = 0; j < posA[i].length; j++) {
	               fw.write(posA[i][j] + " ");
	           }
	           fw.write("\r\n");
	       }
	       fw.close();
	}
}


Вместо нечетных чисел будут нули, т.к. вы используете массивы. Можно сделать через коллекции и чтобы, например, вывод нечетных чисел был в одну строку:

Код два

import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

public class Main {

	public static void main(String[] args) {
		int[][] a = new int[2][2]; //тут все тоже самое
        Random rnd = new Random();
        for (int i = 0;i < a.length;i++) {
            for (int j = 0;j < a[i].length;j++) {
                a[i][j] = rnd.nextInt(10) + 1;
            }
        }
        for (int i = 0; i < a.length; i++, System.out.println()) {
            for (int j = 0; j < a[i].length; j++) {
                System.out.print(a[i][j] + " ");
            }
        }
		
	    try {
			ex6(a, 2, 2);
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
	
	static void ex6(int[][] A, int n, int m) throws IOException {
	       FileWriter fw = new FileWriter("ParCol.txt");
	       List<Integer> list = new ArrayList<>(); //здесь задается коллекция
	       
	       for(int i = 0; i < A.length; i++) {
	           for(int j = 0; j < A[i].length; j++) {
	               if(A[i][j] % 2 == 0) {
	            	   	list.add(A[i][j]); //у коллекции есть метод add, чтобы добавлять элемент
	               }
	           }
	       }

	       fw.write(n + " " + m + "\r\n");
	       for(int i = 0; i < list.size(); i++) {
	               fw.write(list.get(i) + " ");
	           }
	       fw.close();
	}
}

Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@fapsi
Безработный
1. Вложенный цикл у Вас некорректен.
Вместо for(int j=0;j <A.length; j++) нужно прописать for(int j=0 ;j<A[i].length; j++).
A.length для двумерного массива - это количество строк, а A[i].length - количество элементов в каждой i-й строке этого массива. То есть Вы сначала получаете строку в виде массива, потом перебираете каждый элемент полученного массива-строки.
2. Размерность массива A - исходя из п. 1. n = A.length, m = A[0].length. То есть можно так (при условии, что массив не пустой): int[][] posA=new int[A.length][A[0].length], и тогда параметры n и m не нужны.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы