Преобразовать многомерный массив Java в String-Matrix? - PullRequest
2 голосов
/ 08 ноября 2010

Я не могу заставить этот метод toString () работать?Метод deepToString работает отлично, за исключением того, что я должен распечатать их организованно, как будет выглядеть матрица с выровненными строками и столбцами.У меня это работало некоторое время назад, но я кое-что изменил, и теперь бог знает, что я сделал, я понятия не имею, как вернуть это.В любом случае, кто-нибудь знает, как вывести многомерный массив в матрицу, такую ​​как строковая форма?

Кроме того, у меня возникает еще одна проблема: выяснить, как проверить, что числа> = 0, поскольку они не могут быть отрицательными,Не уверен, как это сделать?Я думал, что могу хранить каждое значение в цикле и проверять, отрицательно ли оно, но я все время путаюсь и / или сталкиваюсь с ошибками.Любая помощь по этим вопросам будет принята с благодарностью, я работаю над этим около 5 часов и нигде не получил! _

Вот код, который у меня есть до сих пор:

import java.util.Arrays;

public class MatrixOperations {
public static void main(String[] args) {
    double[][] matrix1 = { { 0.0, 1.0, 2.0 }, { 3.0, 4.0, 5.0 },
            { 6.0, 7.0, 0.8 }, };

    double[][] matrix2 = { { 1.0, 1.0, 1.0 }, { 0.0, 0.0, 0.0 },
            { 2.0, 2.0, 2.0 } };

    System.out.println(toString(matrix1));
    System.out.println(Arrays.deepToString(add(matrix1, matrix2)));
}

// Throws an IllegalArgumentException unless A and B contain n arrays of
// doubles, each of
// which contains m doubles, where both n and m are positive. (In other
// words, both A
// and B are n-by-m arrays.)
//
// Otherwise, returns the n-by-m array that represents the matrix sum of A
// and B.

public static double[][] add(double[][] A, double[][] B) {
    if (A.length != B.length || A[1].length != B[1].length) {
        throw new IllegalArgumentException("Rows and Columns Must Be Equal");
    }
    double[][] S = new double[A.length][A[1].length];
    for (int i = 0; i < A.length; i++) {
        // double valueAt = ;
        for (int j = 0; j < A[1].length; j++) {
            S[i][j] = A[i][j] + B[i][j];
        }
    }
    return S;
}

// Throws an IllegalArgumentException unless A contains n arrays of doubles,
// each of
// which contains k doubles, and B contains k arrays of doubles, each of
// which contains
// m doubles, where n, k, and m are all positive. (In other words, A is an
// n-by-k array and B is a k-by-m array.)

// Otherwise, returns the n-by-m array that represents the matrix product of
// A and B.

// public static double[][] mul (double[][] A, double[][] B) {
// if (A[1].length != B.length){
// throw new IllegalArgumentException("Column-A Must Equal Row-B");
// }
// }

// Throws an IllegalArgumentException unless M contains n arrays of doubles,
// each of
// which contains m doubles, where both n and m are positive. (In other
// words, M
// is a n-by-m array.

// Otherwise, returns a String which, when printed, will be M displayed as a
// nicely
// formatted n-by-m table of doubles.

public static String toString(double[][] M) {
    String separator = ", ";
    StringBuffer result = new StringBuffer();
    if (M.length > 0) {
        result.append(M[0]);
        for (int i = 0; i < M.length; i++) {
            result.append(separator);
            result.append(M[i]);
        }
    }
    return result.toString();
}
}

Спасибо за вашу помощь!:)

Ответы [ 2 ]

3 голосов
/ 08 ноября 2010

Ваш метод toString не напечатает второе измерение, вам нужно два для циклов:

public static String toString(double[][] M) {
    String separator = ", ";
    StringBuffer result = new StringBuffer();

    // iterate over the first dimension
    for (int i = 0; i < M.length; i++) {
        // iterate over the second dimension
        for(int j = 0; j < M[i].length; j++){
            result.append(M[i][j]);
            result.append(separator);
        }
        // remove the last separator
        result.setLength(result.length() - separator.length());
        // add a line break.
        result.append("\n");
    }
    return result.toString();
}

Чтобы проверить, что все числа в данной матрице неотрицательны, вам снова нужно перебрать каждый элемент в матрице. В случае, если любое число является отрицательным, вы можете сразу вернуться, если вы прошли всю матрицу, не найдя никаких отрицательных значений, то их нет:

public static boolean isNonNegative(double[][] m){
    // iterate over first dimension
    for(int i = 0; i < m.length; i++){
        // iterate over second dimension
        for(int j = 0; j < m[i].length; j++){
            if(m[i][j] < 0){
                // found a negative element, return immediately
                // since this means the whole matrix cannot be
                // called non-negative
                return false;
            }
        }
    }
    // if we get here then no elements have been found to be negative
    // thus the matrix is non-negative.
    return true;
}

В примечании, в вашей функции add в строке, где вы говорите for (int j = 0; j < A[1].length; j++) {, у вас может быть проблема, если ваша матрица 1xN. В Java массивы индексируются 0, первая строка - 0, а не 1. В целом более безопасный для вас подход - сделать то, что я показал в этих двух примерах кода, и использовать A[i].length, поскольку вы уверены, что на основе цикла for, индексированного по i, i -я строка A существует.

0 голосов
/ 14 марта 2013

Как насчет Arrays.deepToString () ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...