how to sort multidimensional Array in java logically? - java

i need to sort a multidimensional Array without going for any predefined method, it will be logically..
int arr[][]={{5,2,3},{2,8,5},{7,4,5}};
in the case of single dimensional Array,
int num[]={125,28,31,40,12};
for(int i=0;i<=num.length-1;i++){
for(int k=0;k<=num.length-2;k++){
if(num[k]>num[k+1]){
int temp=0;
temp=num[k];
num[k]=num[k+1];
num[k+1]=temp;
}
}
}
for(int s=0;s<=num.length-1;s++){
System.out.println(num[s]);
}
what would be in case of multidimensional array?

public static void main(String[] args) {
int u, arr[][] = {{1, 7, 2}, {9, 12}, {54, 25, 10}};
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
for (int k = j + 1; k < arr[i].length; k++) {
if (arr[i][j] > arr[i][k]) {
u = arr[i][k];
arr[i][k] = arr[i][j];
arr[i][j] = u;
}
}
System.out.print(arr[i][j] + ",");
}
System.out.println(" ");
}
}

Related

Copy a 1*9 array into a 3*3 array - Java

I'm trying to copy a 1 by 9 array into a 3 by 3 array. I'm not sure why my output is just the number 1 moving across the array. Any help would be greatly appreciated.
public class arrayTest{
public static void main(String [] args)
{
int A [] = {1,2,3,4,5,6,7,8,9};
int B [][] = new int [3][3];
int i = 0, k, j;
for(k = 0; k < 3; k++)
for(j = 0; j < 3; j++ ){
B[k][j] = A[i];
k++;
}
for(k = 0; k < 3; k++)
{
for(j = 0; j< 3; j++)
System.out.print(B[k][j] + " ");
System.out.println();
}
}
}
You need to convert the 2D coordinates from the loop counters into an index into the 1D array:
int A [] = {1,2,3,4,5,6,7,8,9};
int B [][] = new int [3][3];
for (int k=0; k < 3; k++) {
for (int j=0; j < 3; j++) {
B[k][j] = A[k*3 + j];
}
}
System.out.println(Arrays.deepToString(B));
// [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Using Multi-Dimensional Arrays for Matrix Multiplication Java [duplicate]

This question already has answers here:
What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it?
(26 answers)
Closed 4 years ago.
I'm trying to write a code that multiplies two given matrices together and displays the results. Here is the code I have down so far:
public static void main(String[] args) {
double firstMatrix[][] = {{1, 2}, {3, 4}, {5, 6}};
double secondMatrix[][] = {{1, 2, 3}, {4, 5, 6}};
double[][] thirdMatrix = multiplyMatrix((firstMatrix), (secondMatrix));
System.out.println("The product of the matrices is ");
for (int i = 0; i < thirdMatrix.length; i++) {
for (int j = 0; j < thirdMatrix[0].length; j++) {
System.out.print(firstMatrix[i][j] + " ");
if (i == 1 && j == 2) {
System.out.print(" * ");
} else {
System.out.print(" ");
}
}
for (int j = 0; j < thirdMatrix[0].length; j++) {
System.out.print(secondMatrix[i][j] + " ");
if (i == 1 && j == 2) {
System.out.print(" = ");
} else {
System.out.print(" ");
}
}
for (int j = 0; j < thirdMatrix[0].length; j++) {
System.out.printf("%.1f", thirdMatrix[i][j]);
}
System.out.println();
}
}
public static double[][] multiplyMatrix(double[][] a, double[][] b) {
double c[][] = new double[3][3];
for (int i = 0; i < c.length; i++) {
for (int j = 0; j < b.length; j++) {
for (int k = 0; k < a.length; k++) {
c[i][j] += ((a[i][k]) * (b[k][j]));
}
}
}
return c;
}
But when I try to execute the program I receive an Array Index out of Bounds Error which shouldn't be the case since my for loops are making sure not to step out of bounds from the array. I don't understand where to change my code because it looks fine until I try to execute. Any help is really appreciated.
If 1st matrix's dimensions is mxn and the 2nd's nxp then the product's dimensions mxp. Right?
So this 2nd level of the triple loop should iterate through the 2nd dimension of the product array:
for (int j = 0; j < b.length; j++)
should be:
for (int j = 0; j < b[0].length; j++)
b[0].length is the number of columns of the matrix b.
Also the 3d level of the triple loop should be:
for (int k = 0; k < b.length; k++)
b.length is the number of rows of the matrix b which is equal to the number of columns of the matrix a.
Edit
In a generalized version you could change this:
double c[][] = new double[3][3];
to
double c[][] = new double[a.length][b[0].length];
public static void main(String[] args) {
double firstMatrix[][] = {{1, 2}, {3, 4}, {5, 6}};
double secondMatrix[][] = {{1, 2, 3}, {4, 5, 6}};
double[][] thirdMatrix = multiplyMatrix((firstMatrix), (secondMatrix));
System.out.println("The product of the matrices is ");
for (int i = 0; i < thirdMatrix.length; i++) {
for (int j = 0; j < firstMatrix[0].length; j++) {// check this one
System.out.print(firstMatrix[i][j] + " ");
if (i == 1 && j == 2) {
System.out.print(" * ");
} else {
System.out.print(" ");
}
}
for (int j = 0; j < thirdMatrix.length; j++) {
if (i <= 1) {// you need are condition to stop
System.out.print(secondMatrix[i][j] + " ");
if (i == 1 && j == 2) {
System.out.print(" = ");
} else {
System.out.print(" ");
}
}
}
for (int j = 0; j < thirdMatrix[0].length; j++) {
System.out.print(thirdMatrix[i][j]);
}
System.out.println();
}
}
public static double[][] multiplyMatrix(double[][] a, double[][] b) {
double c[][] = new double[3][3];
for (int i = 0; i < c.length; i++) {
// Change b.length to b[0].length;
for (int j = 0; j < b[0].length; j++) {
// Change a.length to a[0].length;
for (int k = 0; k < a[0].length; k++) {
c[i][j] += ((a[i][k]) * (b[k][j]));
}
}
}
return c;
}

Please Tell Me What is Wrong in My Code?!! Need to convert a 2D array into a side by side 1D array

public static void main(String[] args) {
int[][] arr = {{2, 3, 4}, {3, 4, 5, 2}};
System.out.println(line(arr));
}
public static int[] line(int[][] arr) {
int size = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
size++;
}
}
int[] array = new int[size];
int place = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
array[place] = arr[i][j];
place++;
}
}
return array;
}
The eror I'm getting is
----jGRASP exec: java Problem
[I#15db9742
----jGRASP: operation complete.
Every object has a toString() method, and the default method is to display the object's class name representation, then "#" followed by its hashcode. So what you're seeing is the default toString() representation of an int array. To print the data in the array, you can use
System.out.println(java.util.Arrays.toString(line(arr)));
Or you can loop through the array with a for loop like this
int [] res = line(arr);
for(int i=0;i<res.length;i++){
System.out.println(res[i]);
}
import java.util.Arrays;
public class TEst {
public static void main(String[] args) {
int[][] arr = { { 2, 3, 4 }, { 3, 4, 5, 2 } };
System.out.println(Arrays.toString(line(arr)));
}
public static int[] line(int[][] arr) {
int size = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
size++;
}
}
int[] array = new int[size];
int place = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
array[place] = arr[i][j];
place++;
}
}
return array;`enter code here`
}
}
As far as i can see it is working:
public static void main(String[] args) {
int[][] arr = {{2, 3, 4}, {3, 4, 5, 2}};
int[] i = line(arr);
Arrays.stream(i).forEach(x -> System.out.println(x + ""));
}
public static int[] line(int[][] arr) {
int size = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
size++;
}
}
int[] array = new int[size];
int place = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
array[place] = arr[i][j];
place++;
}
}
return array;
}
the only thing is when you are writing out your result you get the object reference not the array in plain text.
2
3
4
3
4
5
2
Process finished with exit code 0

2-dimensional Array Sorting

Sorting a 2-dimensional can be done in two ways :
Converting 2-dimensional to 1-dimensional and then sorting it.
Directly sorting the 2-dimensional array.
I would like to know the second method. Sorting it directly.
Try this. You can sort two dimensional array Directly
int array[][] = { { 12, 43, 21, 87, 32 }, { 43, 75, 21, 45, 65 } };
int t = 0;
for (int x = 0; x < 2; x++) {
for (int y = 0; y < 5; y++) {
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 5; j++) {
if (array[i][j] > array[x][y]) {
t = array[x][y];
array[x][y] = array[i][j];
array[i][j] = t;
}
}
}
}
}
System.out.println("The Sorted Array:");
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 5; j++) {
System.out.print(array[i][j] + "\t");
}
System.out.println();
}

Convert 1D to 2D java.lang.ArrayIndexOutOfBoundsException

I try to convert 1D to 2D array, but I keep getting java.lang.ArrayIndexOutOfBoundsException, and I have tried whatever I could find on the stackoverflow or internet, but I do not understand why I have this issue?
public class Arrayto2DArray {
/**
* #param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
int[] a = {0,1, 6, 83, 4, 5, 12, 7};
int[][] b = new int[4][4];
for (int i = 0; i < b.length; i++) {
for (int j = 0; j < b[i].length; j++) {
b[i][j]=0;
System.out.print(b[i][j]);
}
System.out.println();
}
System.out.println("--------------------------");
for (int i = 0; i < 4; i++) {
for (int j = 0; j < b[i].length; j++) {
try{
b[i][j] = a[i+j*4];
}catch(Exception e){
e.printStackTrace();
System.out.println(e);
}
}
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
System.out.print(b[i][j]);
}
System.out.println();
}
}
}
I kind of know why I get this error and it because of this line
b[i][j] = a[i+j*4];
but I cannot come up any formula better than this.
Consider the second for-loop
Lets say when i = 3 and j= 3
a[i+j*4] evaluates to a[15] which is out of the array
When you declare you 2-d array, you specified int[][] b = new int[4][];, meaning that the first inner for loop for (int j = 0; j < b[i].length; j++) should result in a NullPointerException since b[i].length has no predefined length. Before intering the inner for loop, you should define the size of each b[i] like b[i] = new int[somenumber]
In regards to convert the 1d loop to a 2d, you need to define the rule around spliting it into the 2-d array. Then accordingly the second for loop need modification
EDIT:You modified your code to have an int[4][4] array, which means you have 16 placeholders. Your 1-d array contain only 8 placeholders. It depends on how you want to sort the array, like it can be
b 0 1 2 3
0 0 1 6 83
1 4 5 12 7
2 0 0 0 0
3 0 0 0 0
or any other pattern
Assuming the length of 1-d array is 8 and the total index of 2-d array is 16, the following is more of a general solution:
public static void main(String[] args) {
// TODO code application logic here
int[] a = { 0, 1, 6, 83, 4, 5, 12, 7 };
int[][] b = new int[4][4];
for (int i = 0; i < b.length; i++) {
for (int j = 0; j < b[i].length; j++) {
b[i][j] = 0;
System.out.print(b[i][j] + "\t");
}
System.out.println();
}
System.out.println("--------------------------");
for (int i = 0; i < 4; i++) {
for (int j = 0; j < b[i].length; j++) {
try {
if ((j + i * 4) < a.length)
b[i][j] = a[j + i * 4];
} catch (Exception e) {
e.printStackTrace();
System.out.println(e);
}
}
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
System.out.print(b[i][j] + "\t");
}
System.out.println();
}
}
What is wrong is your 2D array is a 4*4, so that means for each index, there will be 4 elements i.e. say values. So there would be a total of 16 values, so you would need a 1D array with 16 elements for the above code to work. Right now you have only 8 values in your 1D array.
I think your code should change like this
public class Arrayto2DArray {
public static void main(String[] args) {
// TODO code application logic here
int[] a = {0,1, 6, 83, 4, 5, 12, 7};
int[][] b = new int[4][2];
for (int i = 0; i < b.length; i++) {
for (int j = 0; j < b[i].length; j++) {
b[i][j]=0;
System.out.print(b[i][j]);
}
System.out.println();
}
System.out.println("--------------------------");
for (int i = 0; i < 4; i++) {
for (int j = 0; j < b[i].length; j++) {
try{
b[i][j] = a[i+j*4];
}catch(Exception e){
e.printStackTrace();
System.out.println(e);
}
}
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 2; j++) {
System.out.print(b[i][j]+" ");
}
System.out.println();
}
}
}
Your correct formula should be like.
int[] a = {0,1, 6, 83, 4, 5, 12, 7};
int[][] b = new int[4][2];
int k=0;
for (int i = 0; i < b.length; i++) { // Column of 2D array
for (int j = 0; j < b[0].length; j++) { // Row of 2D array
b[i][j]= a[k++];
System.out.println(b[i][j]);
}
}
Edit:
For general case, If your row is fixed at 4 but column is not fixed than your 2D conversion formula should be like below.
int col = a.length / 4;
int remainder = a.length % 4;
if (remainder > 0) {
col = col + 1; // Get the correct column size.
}
int[][] b = new int[4][col];
int k = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < col; j++) {
if (k < a.length) {
b[i][j] = a[k];
System.out.println(b[i][j]);
}
k++;
}
}

Categories