#java #arrays #loops
#java #массивы #циклы
Вопрос:
Я самостоятельно изучал Java с помощью нескольких бесплатных онлайн-руководств и поставил перед собой задачу выполнить практически все практические упражнения. Я застрял на этом уже неделю, и это сводит меня с ума. Я чувствую, что я довольно близок, просто сбит с толку различной длиной массива, которые составляют неравномерные столбцы.
public class Testing {
public static void main(String[] args) {
int[][] data = { {3, 2, 5},
{1, 4, 4, 8, 13},
{9, 1, 0, 2},
{0, 2, 6, 3, -1, -8} };
int sum = 0;
int row = 0;
int col = 0;
int currentRow = 0;
while (currentRow < data.length) {
for (col = 0; col < data[currentRow].length; col ) {
sum = 0;
for (row = 0; row < data.length; row ) {
System.out.println(data[row][col]);
sum = data[row][col];
}
System.out.println("Sum: " sum);
}
currentRow ;
}
}
}
Комментарии:
1. кажется, что одного цикла слишком много. Вы
while
проходите через первое измерение иfor(row...
второе измерение. Таким образом, нет необходимости снова просматривать данные с помощью `for(row …`2. под суммами столбцов вы подразумеваете сумму элемента x в каждом массиве, поэтому в вашем случае сумма первого столбца будет равна 13, а 6-й столбец будет равен -8, поскольку это единственный столбец в столбце?
Ответ №1:
Если вы попытаетесь вычислить суммы строк
кажется, что одного цикла слишком много. Вы while
проходите через первое измерение и for(row...
второе измерение. Таким образом, нет необходимости снова просматривать данные, for(row...
попробовав это с одним циклом меньше, чем:
public class Testing {
public static void main(String[] args) {
int[][] data = { {3, 2, 5},
{1, 4, 4, 8, 13},
{9, 1, 0, 2},
{0, 2, 6, 3, -1, -8} };
int sum = 0;
for (int currentRow = 0; currentRow < data.length; currentRow ) {
sum = 0;
for (int col = 0; col < data[currentRow].length; col ) {
System.out.println(data[currentRow][col]);
sum = data[currentRow][col];
}
System.out.println("Sum: " sum);
}
}
}
Если вы попытаетесь вычислить суммы столбцов
public class Testing {
public static void main(String[] args) {
int[][] data = { {3, 2, 5},
{1, 4, 4, 8, 13},
{9, 1, 0, 2},
{0, 2, 6, 3, -1, -8} };
// get max length of a row == number of columns
int length = 0;
for (int r = 0; r < data.length; r ) {
int currLength = data[r].length;
if(currLength>length) length = currLength;
}
// create array for column sums
int[] sums = new int[length];
// fill array with zeros
Arrays.fill(sums, 0);
// sum up
for (int currentRow = 0; currentRow < data.length; currentRow ) {
for (int col = 0; col < data[currentRow].length; col ) {
System.out.println(data[currentRow][col]);
sums[col] = data[currentRow][col];
}
}
// print sums
for (int i = 0; i < sums.length; i ) {
System.out.println(i ": " sums[i]);
}
}
}
Комментарии:
1. Поддержано, но я бы предпочел, чтобы значение
while
преобразовывалось вfor
— если оно инициализирует значение int равным 0, выполняет циклы, пока оно меньше максимального, и увеличивает его каждый раз, оно выглядит лучше какfor
2. Спасибо множеству sailingthorns, это сработало отлично, и я определенно могу понять, зачем понадобился массив для сумм. Я полагаю, что я застрял на суммировании всех элементов столбца по одному за раз, вместо того, чтобы распределять его и суммировать каждый постепенно. Еще раз спасибо!
3. нет проблем, рад вам помочь! Было бы мило с вашей стороны, если бы вы могли отметить мой ответ как правильный или поддержать его. спасибо
Ответ №2:
Если я правильно понимаю ваш вопрос, и вы хотите получить сумму первого, второго, третьего и т.д. Столбцов, вы могли бы попробовать следующее.
// array for the sums of the columns
int[] colSums;
int largestSize = 0;
// loop through and find the largest array of values (in this example its the 4th)
for(int x = 0; x < data.length; x ) {
largestSize = Math.max(largestSize,data[x].length);
}
colSums = new int[largestSize]; // create the int array with the right length
// loop through the data array and add sums to the colSums array
for(int x = 0; x < data.length; x ) {
colSums[x] = 0; // so that its not null when we add to it
for(int y = 0; y < data[x].length; y ) {
// here I add the number to the solSums array
colSums[y] = data[x][y];
}
}
// now colSums[0] will be the sum of the first column, colSums[1] = sum of second, etc...
Комментарии:
1. Я не запускал код для его тестирования, но идея должна быть правильной.
2. JStephen, я протестировал, и первый столбец, а также последние два итоговых столбца работают корректно, хотя несколько в середине не суммировались правильно. Однако эта идея похожа на другую, опубликованную выше, и, похоже, почти точна. Спасибо за вашу помощь!