Why is this line printing twice?
So I help tutor an Algebra 2 class at my local high school, and the class is currently looking over matrices. Though not there, they will eventually get to multiplication of matrices. After taking Computer Science last year and learning Java, the teacher I help thought I should try to write a program to multiple matrices.
At the moment, I have up to defining the numbers for the first array that holds the information for the first matrix. However, I have a small issue. As represented by this picture:
the line asking for the index integers is being repeated after already recording the integers. I assume this is due to my layered for loops, but I can't be for certain. Usually new eyes see problems clearer. Any who could help me would be appreciated.
Code:
package matrixmultiplication;
import java.util.*;
public class MatrixMultiplication
public static void main(String args)
System.out.println("What is the size of the first matrix?");
int matrix1Rows = matrixRows();
int matrix1Columns = matrixColumns();
int matrix1 = new int[matrix1Rows * matrix1Columns];
doubleSpace();
System.out.println("What is the size of the second matrix?");
int matrix2Rows = matrixRows();
int matrix2Columns = matrixColumns();
int matrix2 = new int[matrix2Rows * matrix2Columns];
doubleSpace();
if (matrix1Columns != matrix2Rows)
System.out.println("These cannot be multiplied!");
System.exit(0);
else
matrix1Numbers(matrix1Rows, matrix1Columns);
public static int matrixRows()
System.out.print("Rows:");
Scanner rowSc = new Scanner(System.in);
int rows = rowSc.nextInt();
return rows;
public static int matrixColumns()
System.out.print("Columns:");
Scanner colSc = new Scanner(System.in);
int cols = colSc.nextInt();
return cols;
public static int matrix1Numbers(int rows, int cols)
int numb = new int[rows * cols];
for (int j = 0; j <= numb.length; j += rows)
for (int i = 1; i <= cols; i++)
for (int k = 1; k <= rows; k++)
System.out.println("What is the value for index (" + k + "," + i + ")?");
Scanner inp = new Scanner(System.in);
if (j + k <= numb.length)
numb[j + k - 1] = inp.nextInt();
for (int i = 0; i < numb.length; i++)
System.out.println(numb[i]);
return numb;
public static void doubleSpace()
System.out.println();
System.out.println();
I use NetBeans 8.2 and the latest working version of Java for NetBeans.
java arrays debugging matrix matrix-multiplication
add a comment |
So I help tutor an Algebra 2 class at my local high school, and the class is currently looking over matrices. Though not there, they will eventually get to multiplication of matrices. After taking Computer Science last year and learning Java, the teacher I help thought I should try to write a program to multiple matrices.
At the moment, I have up to defining the numbers for the first array that holds the information for the first matrix. However, I have a small issue. As represented by this picture:
the line asking for the index integers is being repeated after already recording the integers. I assume this is due to my layered for loops, but I can't be for certain. Usually new eyes see problems clearer. Any who could help me would be appreciated.
Code:
package matrixmultiplication;
import java.util.*;
public class MatrixMultiplication
public static void main(String args)
System.out.println("What is the size of the first matrix?");
int matrix1Rows = matrixRows();
int matrix1Columns = matrixColumns();
int matrix1 = new int[matrix1Rows * matrix1Columns];
doubleSpace();
System.out.println("What is the size of the second matrix?");
int matrix2Rows = matrixRows();
int matrix2Columns = matrixColumns();
int matrix2 = new int[matrix2Rows * matrix2Columns];
doubleSpace();
if (matrix1Columns != matrix2Rows)
System.out.println("These cannot be multiplied!");
System.exit(0);
else
matrix1Numbers(matrix1Rows, matrix1Columns);
public static int matrixRows()
System.out.print("Rows:");
Scanner rowSc = new Scanner(System.in);
int rows = rowSc.nextInt();
return rows;
public static int matrixColumns()
System.out.print("Columns:");
Scanner colSc = new Scanner(System.in);
int cols = colSc.nextInt();
return cols;
public static int matrix1Numbers(int rows, int cols)
int numb = new int[rows * cols];
for (int j = 0; j <= numb.length; j += rows)
for (int i = 1; i <= cols; i++)
for (int k = 1; k <= rows; k++)
System.out.println("What is the value for index (" + k + "," + i + ")?");
Scanner inp = new Scanner(System.in);
if (j + k <= numb.length)
numb[j + k - 1] = inp.nextInt();
for (int i = 0; i < numb.length; i++)
System.out.println(numb[i]);
return numb;
public static void doubleSpace()
System.out.println();
System.out.println();
I use NetBeans 8.2 and the latest working version of Java for NetBeans.
java arrays debugging matrix matrix-multiplication
Did you realize you can have anint
in Java? It's a lot more convenient to writenumb[j][k]
rather thannumb[j * cols + k]
for the item at rowj
, columnk
.
– Kevin Anderson
Nov 14 '18 at 2:54
In any case, you've got an extra level of loop nesting that's unneeded. The first level steps through the rows, the next steps through the columns, and the third steps through the rows again.
– Kevin Anderson
Nov 14 '18 at 2:57
add a comment |
So I help tutor an Algebra 2 class at my local high school, and the class is currently looking over matrices. Though not there, they will eventually get to multiplication of matrices. After taking Computer Science last year and learning Java, the teacher I help thought I should try to write a program to multiple matrices.
At the moment, I have up to defining the numbers for the first array that holds the information for the first matrix. However, I have a small issue. As represented by this picture:
the line asking for the index integers is being repeated after already recording the integers. I assume this is due to my layered for loops, but I can't be for certain. Usually new eyes see problems clearer. Any who could help me would be appreciated.
Code:
package matrixmultiplication;
import java.util.*;
public class MatrixMultiplication
public static void main(String args)
System.out.println("What is the size of the first matrix?");
int matrix1Rows = matrixRows();
int matrix1Columns = matrixColumns();
int matrix1 = new int[matrix1Rows * matrix1Columns];
doubleSpace();
System.out.println("What is the size of the second matrix?");
int matrix2Rows = matrixRows();
int matrix2Columns = matrixColumns();
int matrix2 = new int[matrix2Rows * matrix2Columns];
doubleSpace();
if (matrix1Columns != matrix2Rows)
System.out.println("These cannot be multiplied!");
System.exit(0);
else
matrix1Numbers(matrix1Rows, matrix1Columns);
public static int matrixRows()
System.out.print("Rows:");
Scanner rowSc = new Scanner(System.in);
int rows = rowSc.nextInt();
return rows;
public static int matrixColumns()
System.out.print("Columns:");
Scanner colSc = new Scanner(System.in);
int cols = colSc.nextInt();
return cols;
public static int matrix1Numbers(int rows, int cols)
int numb = new int[rows * cols];
for (int j = 0; j <= numb.length; j += rows)
for (int i = 1; i <= cols; i++)
for (int k = 1; k <= rows; k++)
System.out.println("What is the value for index (" + k + "," + i + ")?");
Scanner inp = new Scanner(System.in);
if (j + k <= numb.length)
numb[j + k - 1] = inp.nextInt();
for (int i = 0; i < numb.length; i++)
System.out.println(numb[i]);
return numb;
public static void doubleSpace()
System.out.println();
System.out.println();
I use NetBeans 8.2 and the latest working version of Java for NetBeans.
java arrays debugging matrix matrix-multiplication
So I help tutor an Algebra 2 class at my local high school, and the class is currently looking over matrices. Though not there, they will eventually get to multiplication of matrices. After taking Computer Science last year and learning Java, the teacher I help thought I should try to write a program to multiple matrices.
At the moment, I have up to defining the numbers for the first array that holds the information for the first matrix. However, I have a small issue. As represented by this picture:
the line asking for the index integers is being repeated after already recording the integers. I assume this is due to my layered for loops, but I can't be for certain. Usually new eyes see problems clearer. Any who could help me would be appreciated.
Code:
package matrixmultiplication;
import java.util.*;
public class MatrixMultiplication
public static void main(String args)
System.out.println("What is the size of the first matrix?");
int matrix1Rows = matrixRows();
int matrix1Columns = matrixColumns();
int matrix1 = new int[matrix1Rows * matrix1Columns];
doubleSpace();
System.out.println("What is the size of the second matrix?");
int matrix2Rows = matrixRows();
int matrix2Columns = matrixColumns();
int matrix2 = new int[matrix2Rows * matrix2Columns];
doubleSpace();
if (matrix1Columns != matrix2Rows)
System.out.println("These cannot be multiplied!");
System.exit(0);
else
matrix1Numbers(matrix1Rows, matrix1Columns);
public static int matrixRows()
System.out.print("Rows:");
Scanner rowSc = new Scanner(System.in);
int rows = rowSc.nextInt();
return rows;
public static int matrixColumns()
System.out.print("Columns:");
Scanner colSc = new Scanner(System.in);
int cols = colSc.nextInt();
return cols;
public static int matrix1Numbers(int rows, int cols)
int numb = new int[rows * cols];
for (int j = 0; j <= numb.length; j += rows)
for (int i = 1; i <= cols; i++)
for (int k = 1; k <= rows; k++)
System.out.println("What is the value for index (" + k + "," + i + ")?");
Scanner inp = new Scanner(System.in);
if (j + k <= numb.length)
numb[j + k - 1] = inp.nextInt();
for (int i = 0; i < numb.length; i++)
System.out.println(numb[i]);
return numb;
public static void doubleSpace()
System.out.println();
System.out.println();
I use NetBeans 8.2 and the latest working version of Java for NetBeans.
java arrays debugging matrix matrix-multiplication
java arrays debugging matrix matrix-multiplication
asked Nov 14 '18 at 2:43
CurlyCueCurlyCue
141
141
Did you realize you can have anint
in Java? It's a lot more convenient to writenumb[j][k]
rather thannumb[j * cols + k]
for the item at rowj
, columnk
.
– Kevin Anderson
Nov 14 '18 at 2:54
In any case, you've got an extra level of loop nesting that's unneeded. The first level steps through the rows, the next steps through the columns, and the third steps through the rows again.
– Kevin Anderson
Nov 14 '18 at 2:57
add a comment |
Did you realize you can have anint
in Java? It's a lot more convenient to writenumb[j][k]
rather thannumb[j * cols + k]
for the item at rowj
, columnk
.
– Kevin Anderson
Nov 14 '18 at 2:54
In any case, you've got an extra level of loop nesting that's unneeded. The first level steps through the rows, the next steps through the columns, and the third steps through the rows again.
– Kevin Anderson
Nov 14 '18 at 2:57
Did you realize you can have an
int
in Java? It's a lot more convenient to write numb[j][k]
rather than numb[j * cols + k]
for the item at row j
, column k
.– Kevin Anderson
Nov 14 '18 at 2:54
Did you realize you can have an
int
in Java? It's a lot more convenient to write numb[j][k]
rather than numb[j * cols + k]
for the item at row j
, column k
.– Kevin Anderson
Nov 14 '18 at 2:54
In any case, you've got an extra level of loop nesting that's unneeded. The first level steps through the rows, the next steps through the columns, and the third steps through the rows again.
– Kevin Anderson
Nov 14 '18 at 2:57
In any case, you've got an extra level of loop nesting that's unneeded. The first level steps through the rows, the next steps through the columns, and the third steps through the rows again.
– Kevin Anderson
Nov 14 '18 at 2:57
add a comment |
2 Answers
2
active
oldest
votes
Why is this line printing twice?
Because in your loop here:
for (int k = 1; k <= rows; k++)
System.out.println("What is the value for index (" + k + "," + i + ")?");
Scanner inp = new Scanner(System.in);
if (j + k <= numb.length)
numb[j + k - 1] = inp.nextInt();
You only ask for input if j + k <= numb.length
but you loop while k <= rows
, and print every iteration. There must a value for which you are still looping but j + k > numb.length
. To fix this, change so that your loop with both of the conditions:
for(int k = 1; k <= rows && j + k <= numb.length; k++)
And then remove the if
part, and ask for input on every iteration.
Also you are creating a new Scanner
object inside of your loop, which will create a new Scanner
on every iteration. Move the deceleration outside of the loop.
add a comment |
I'm not familiar with the matrixmultiplication package, so I may be rambling here.
for (int j = 0; j <= numb.length; j += rows){
I'm not entirely sure what the outer for loop your have is for, but this most outer for loop causes you to ask for the values of the indices cols times more than you want.
I feel that you originally wanted to use this outer for loop to iterate through each row, and wasn't planning on having the second for loop iterating through cols perhaps?
Also, Kevin Anderson mentions this above. You might avoid this problem altogether if you return a double int array as opposed to storing all values in the matrix in a single dimension. I personally feel it would make more sense.
Just nitpicking, but I wouldn't make a new scanner every time you want to use one in a different method. You could just make a field at the top of your class, instantiate it once in your main method, and then pass it in as a parameter to all methods using the scanner.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53292438%2fwhy-is-this-line-printing-twice%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
Why is this line printing twice?
Because in your loop here:
for (int k = 1; k <= rows; k++)
System.out.println("What is the value for index (" + k + "," + i + ")?");
Scanner inp = new Scanner(System.in);
if (j + k <= numb.length)
numb[j + k - 1] = inp.nextInt();
You only ask for input if j + k <= numb.length
but you loop while k <= rows
, and print every iteration. There must a value for which you are still looping but j + k > numb.length
. To fix this, change so that your loop with both of the conditions:
for(int k = 1; k <= rows && j + k <= numb.length; k++)
And then remove the if
part, and ask for input on every iteration.
Also you are creating a new Scanner
object inside of your loop, which will create a new Scanner
on every iteration. Move the deceleration outside of the loop.
add a comment |
Why is this line printing twice?
Because in your loop here:
for (int k = 1; k <= rows; k++)
System.out.println("What is the value for index (" + k + "," + i + ")?");
Scanner inp = new Scanner(System.in);
if (j + k <= numb.length)
numb[j + k - 1] = inp.nextInt();
You only ask for input if j + k <= numb.length
but you loop while k <= rows
, and print every iteration. There must a value for which you are still looping but j + k > numb.length
. To fix this, change so that your loop with both of the conditions:
for(int k = 1; k <= rows && j + k <= numb.length; k++)
And then remove the if
part, and ask for input on every iteration.
Also you are creating a new Scanner
object inside of your loop, which will create a new Scanner
on every iteration. Move the deceleration outside of the loop.
add a comment |
Why is this line printing twice?
Because in your loop here:
for (int k = 1; k <= rows; k++)
System.out.println("What is the value for index (" + k + "," + i + ")?");
Scanner inp = new Scanner(System.in);
if (j + k <= numb.length)
numb[j + k - 1] = inp.nextInt();
You only ask for input if j + k <= numb.length
but you loop while k <= rows
, and print every iteration. There must a value for which you are still looping but j + k > numb.length
. To fix this, change so that your loop with both of the conditions:
for(int k = 1; k <= rows && j + k <= numb.length; k++)
And then remove the if
part, and ask for input on every iteration.
Also you are creating a new Scanner
object inside of your loop, which will create a new Scanner
on every iteration. Move the deceleration outside of the loop.
Why is this line printing twice?
Because in your loop here:
for (int k = 1; k <= rows; k++)
System.out.println("What is the value for index (" + k + "," + i + ")?");
Scanner inp = new Scanner(System.in);
if (j + k <= numb.length)
numb[j + k - 1] = inp.nextInt();
You only ask for input if j + k <= numb.length
but you loop while k <= rows
, and print every iteration. There must a value for which you are still looping but j + k > numb.length
. To fix this, change so that your loop with both of the conditions:
for(int k = 1; k <= rows && j + k <= numb.length; k++)
And then remove the if
part, and ask for input on every iteration.
Also you are creating a new Scanner
object inside of your loop, which will create a new Scanner
on every iteration. Move the deceleration outside of the loop.
answered Nov 14 '18 at 2:48
GBlodgettGBlodgett
9,68941733
9,68941733
add a comment |
add a comment |
I'm not familiar with the matrixmultiplication package, so I may be rambling here.
for (int j = 0; j <= numb.length; j += rows){
I'm not entirely sure what the outer for loop your have is for, but this most outer for loop causes you to ask for the values of the indices cols times more than you want.
I feel that you originally wanted to use this outer for loop to iterate through each row, and wasn't planning on having the second for loop iterating through cols perhaps?
Also, Kevin Anderson mentions this above. You might avoid this problem altogether if you return a double int array as opposed to storing all values in the matrix in a single dimension. I personally feel it would make more sense.
Just nitpicking, but I wouldn't make a new scanner every time you want to use one in a different method. You could just make a field at the top of your class, instantiate it once in your main method, and then pass it in as a parameter to all methods using the scanner.
add a comment |
I'm not familiar with the matrixmultiplication package, so I may be rambling here.
for (int j = 0; j <= numb.length; j += rows){
I'm not entirely sure what the outer for loop your have is for, but this most outer for loop causes you to ask for the values of the indices cols times more than you want.
I feel that you originally wanted to use this outer for loop to iterate through each row, and wasn't planning on having the second for loop iterating through cols perhaps?
Also, Kevin Anderson mentions this above. You might avoid this problem altogether if you return a double int array as opposed to storing all values in the matrix in a single dimension. I personally feel it would make more sense.
Just nitpicking, but I wouldn't make a new scanner every time you want to use one in a different method. You could just make a field at the top of your class, instantiate it once in your main method, and then pass it in as a parameter to all methods using the scanner.
add a comment |
I'm not familiar with the matrixmultiplication package, so I may be rambling here.
for (int j = 0; j <= numb.length; j += rows){
I'm not entirely sure what the outer for loop your have is for, but this most outer for loop causes you to ask for the values of the indices cols times more than you want.
I feel that you originally wanted to use this outer for loop to iterate through each row, and wasn't planning on having the second for loop iterating through cols perhaps?
Also, Kevin Anderson mentions this above. You might avoid this problem altogether if you return a double int array as opposed to storing all values in the matrix in a single dimension. I personally feel it would make more sense.
Just nitpicking, but I wouldn't make a new scanner every time you want to use one in a different method. You could just make a field at the top of your class, instantiate it once in your main method, and then pass it in as a parameter to all methods using the scanner.
I'm not familiar with the matrixmultiplication package, so I may be rambling here.
for (int j = 0; j <= numb.length; j += rows){
I'm not entirely sure what the outer for loop your have is for, but this most outer for loop causes you to ask for the values of the indices cols times more than you want.
I feel that you originally wanted to use this outer for loop to iterate through each row, and wasn't planning on having the second for loop iterating through cols perhaps?
Also, Kevin Anderson mentions this above. You might avoid this problem altogether if you return a double int array as opposed to storing all values in the matrix in a single dimension. I personally feel it would make more sense.
Just nitpicking, but I wouldn't make a new scanner every time you want to use one in a different method. You could just make a field at the top of your class, instantiate it once in your main method, and then pass it in as a parameter to all methods using the scanner.
answered Nov 14 '18 at 3:36
Shawn GeShawn Ge
1
1
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53292438%2fwhy-is-this-line-printing-twice%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Did you realize you can have an
int
in Java? It's a lot more convenient to writenumb[j][k]
rather thannumb[j * cols + k]
for the item at rowj
, columnk
.– Kevin Anderson
Nov 14 '18 at 2:54
In any case, you've got an extra level of loop nesting that's unneeded. The first level steps through the rows, the next steps through the columns, and the third steps through the rows again.
– Kevin Anderson
Nov 14 '18 at 2:57