Вам необходимо осмысленно реализовать toString()
.
Этот toString()
(ниже), возможно, подходит для отладки, но будет уродливым и запутанным, если вы будете использовать его для реального пользовательского вывода.Фактическое решение, вероятно, будет использовать Formatter
некоторым сложным способом для создания аккуратно табличных строк и столбцов.
Некоторые дополнительные рекомендации, основанные на вашем коде:
- Предложите не хранить размеры строк / столбцов отдельно. SSOT / Единый источник истины или DRY , Java + DRY .Просто используйте
.length
и предоставьте методы доступа, если это необходимо. - Используйте
final
в аргументах метода, это устранит ошибки, как у вас выше, неверный псевдоним numbers
внутри конструктора - Используйте экземпляр, а не
static
Паранойя - это стиль жизни программиста: я также изменил свой код, чтобы сделать deepCopy
из предоставленного массива int[][]
, в противном случае возникает утечка ссылок,и класс Matrix
не сможет применить свои собственные инварианты, если код вызывающего абонента позже изменит int[][]
, который они передали.
Я сделал свой Matrix
неизменным (см. * 1039).*) по привычке.Это хорошая практика, если только у вас нет веских причин для изменчивой реализации (это не удивительно для производительности в матрицах).
Вот несколько улучшенных кодов:
public final class Matrix
{
final private int[][] numbers;
// note the final, which would find a bug in your cited code above...
public Matrix(final int[][] numbers)
{
// by enforcing these assumptions / invariants here, you don't need to deal
// with checking them in other parts of the code. This is long enough that you might
// factor it out into a private void sanityCheck() method, which could be
// applied elsewhere when there are non-trivial mutations of the internal state
if (numbers == null || numbers.length == 0)
throw new NullPointerException("Matrix can't have null contents or zero rows");
final int columns = numbers[0].length;
if (columns == 0)
throw new IllegalArgumentException("Matrix can't have zero columns");
for (int i =1; i < numbers.length; i++) {
if (numbers[i] == null)
throw new NullPointerException("Matrix can't have null row "+i);
if (numbers[i].length != columns)
throw new IllegalArgumentException("Matrix can't have differing row lengths!");
}
this.numbers = deepCopy(numbers);
}
public boolean isSquareMatrix() { return rowCount() == columnCount(); }
public int rowCount() { return numbers.length; }
public int columnCount() {return numbers[0].length; }
private static int[][] deepCopy(final int[][] source)
{
// note we ignore error cases that don't apply because of
// invariants in the constructor:
assert(source != null); assert(source.length != 0);
assert(source[0] != null); assert(source[0].length != 0);
int[][] target = new int[source.length][source[0].length];
for (int i = 0; i < source.length; i++)
target[i] = Arrays.copyOf(source[i],source[i].length);
return target;
}
public Matrix getTranspose()
{
int[][] trans = new int[columnCount()][rowCount()];
for (int i = 0; i < rowCount(); i++)
for (int j = 0; j < columnCount(); j++)
trans[i][j] = getValue(j, i);
return new Matrix(trans);
}
@Override
public String toString()
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < numbers.length; i++)
{
for (int j = 0; j < numbers[i].length; j++)
sb.append(' ').append(numbers[i][j]);
sb.append('\n');
}
return sb.toString();
}
public static void main(String[] args)
{
final int[][] m1 = new int[][] { { 1, 4 }, { 5, 3 } };
Matrix mat = new Matrix(m1);
System.out.print(mat);
System.out.print(mat.getTranspose());
}
}