Populating a 2D array with for loop

edited April 2014 in How To...

Hi
Im trying to create a 2D array which holds a number grid.
like this:

12 12 23 46 45 99
12 12 23 46 56 34
12 12 23 46 45 34
12 12 87 46 45 34
12 12 23 46 45 34
12 12 23 46 45 34

(just testing so these are just random numbers)

My first idea was to just create a string for each row and then convert them to integers so i can use the numbers but that would need a new line for every row which gets quite alot if the grid was bigger.
my first attempt:

String row1 = "12 12 23 46 45 99";  
String row2 = "12 12 23 46 56 34";  
String row3 = "12 12 23 46 45 34";  
String row4 = "12 12 87 46 45 34";  
String row5 = "12 12 23 46 45 34";  
String row6 = "12 12 23 46 45 34";  

int[] nums1 = int(split(row1, ' '));  
int[] nums2 = int(split(row2, ' '));  
int[] nums3 = int(split(row3, ' '));  
int[] nums4 = int(split(row4, ' '));  
int[] nums5 = int(split(row5, ' '));  
int[] nums6 = int(split(row6, ' '));  

But i figured a 2D array would be much better. Ive not really done anything with 2D arrays but as far as i understand it gives each value in the array a 2 number co-ordinate or location right?

so how would i go about filling this array with the string of numbers?

int[][] numberGrid = new int[5][5];  

for (int y = 0; y < 5; y++) {  
  for (int x = 0; x < 5; x++) {  
    numberGrid[x][y] = //WHAT GOES HERE?;  
  }  
}  

thanks in advance

Answers

  • sussus
    edited April 2014 Answer ✓

    I. If these number are the exact one you need, the easiest way to import them is via a .csv file imported into a table:

    this is what your .csv file should look like, let's call it "number.csv" (create it with notePad or excell) and put it inside the data folder.

    12, 12, 23, 46, 45, 99
    12, 12, 23, 46, 56, 34
    12, 12, 23, 46, 45, 34
    12, 12, 87, 46, 45, 34
    12, 12, 23, 46, 45, 34
    12, 12, 23, 46, 45, 34
    

    then, create a table (http://processing.org/reference/Table.html)

    Table myNumbers;
    myNumbers = loadTable("data/number.csv");
    columnCount = myNumbers.getColumnCount(); // get the x border of the table
    rowCount = myNumbers.getRowCount(); // get the y border of the table
    

    We can now use these value as such or fill them into an array (the table already is some kind of array, but you can feel more confortable with the array syntax) :

        for (int y = 0; y < rowCount; y++) {
           for (int x = 0; x < columnCount; x++) {
              numberGrid[x][y] = myNumbers.getFloat(x,y);
           }
        }
    

    if you want to acces these values, you can use the table.getFloat(x,y) access or the Array[x][y] access...

    II. if you just want to use random numbers :

        for (int y = 0; y < 5; y++) {
           for (int x = 0; x < 5; x++) {
              numberGrid[x][y] = random(0,100);
           }
        }
    

    and we are good to go !

  • awesome that table thing is quite useful and fairly easy to understand. Another question, im trying to select 4 numbers diagonally and its just not working. Here is what ive written so far, should be working but maybe i left something out:

      //diagonal top left to bottom right
    for (int y = 0; y < rows-3; y++) {
      for (int x = 0; x < columns-3; x++) {
        if (numbers.getFloat(x, y) * numbers.getFloat(x+1, y+1) * numbers.getFloat(x+2, y+2) * numbers.getFloat(x+3, y+3) > product) {
          product = int(numbers.getFloat(x, y) * numbers.getFloat(x+1, y+1) * numbers.getFloat(x+2, y+2) * numbers.getFloat(x+3, y+3));
          a = int(numbers.getFloat(x, y));
          b = int(numbers.getFloat(x+1, y+1));
          c = int(numbers.getFloat(x+2, y+2));
          d = int(numbers.getFloat(x+3, y+3));
        }
      }
    }
    
    println(product);
    println(a + " " + b + " " + c + " " + d);
    

    it seems right to me but when i look at the values of a, b, c and d i found out the are all on the same row, so im not sure what going wrong.

  • can't see what's wrong either, can you post a full version of the code and the csv attached ?

  • shouldn't you have this outside the double for-loop

    with pre-defined x and y

     product = int(numbers.getFloat(x, y) * numbers.getFloat(x+1, y+1) * numbers.getFloat(x+2, y+2) * numbers.getFloat(x+3, y+3));
          a = int(numbers.getFloat(x, y));
          b = int(numbers.getFloat(x+1, y+1));
          c = int(numbers.getFloat(x+2, y+2));
          d = int(numbers.getFloat(x+3, y+3));
    
  • can't see what's wrong either, can you post a full version of the code and the csv attached ?

    i will but just a heads up im doing this for one of the project Euler questions so might ruin it for others.

    int columns = 0;
    int rows = 0;
    int product = 0;
    int a = 0;
    int b = 0;
    int c = 0;
    int d = 0;
    
    Table numbers;
    numbers = loadTable("table.csv");
    columns = numbers.getColumnCount();
    rows = numbers.getRowCount();
    
    //left right
    for (int y = 0; y < rows; y++) {
      for (int x = 0; x < columns-3; x++) {
        if (numbers.getFloat(x, y) * numbers.getFloat(x+1, y) * numbers.getFloat(x+2, y) * numbers.getFloat(x+3, y) > product) {
          product = int(numbers.getFloat(x, y) * numbers.getFloat(x+1, y) * numbers.getFloat(x+2, y) * numbers.getFloat(x+3, y));
          a = int(numbers.getFloat(x, y));
          b = int(numbers.getFloat(x+1, y));
          c = int(numbers.getFloat(x+2, y));
          d = int(numbers.getFloat(x+3, y));
        }
      }
    }
    println(product);
    println(a + " " + b + " " + c + " " + d);
    
    //up down
    for (int x = 0; x < columns; x++) {
      for (int y = 0; y < rows-3; y++) {
        if (numbers.getFloat(x, y) * numbers.getFloat(x, y+1) * numbers.getFloat(x, y+2) * numbers.getFloat(x, y+3) > product) {
          product = int(numbers.getFloat(x, y) * numbers.getFloat(x, y+1) * numbers.getFloat(x, y+2) * numbers.getFloat(x, y+3));
          a = int(numbers.getFloat(x, y));
          b = int(numbers.getFloat(x, y+1));
          c = int(numbers.getFloat(x, y+2));
          d = int(numbers.getFloat(x, y+3));
        }
      }
    }
    println(product);
    println(a + " " + b + " " + c + " " + d);
    
    //diagonal bottom left to top right
    for (int y = 0; y < rows-3; y++) {
      for (int x = 0; x < columns-3; x++) {
        if (numbers.getFloat(x, y+3) * numbers.getFloat(x+1, y+2) * numbers.getFloat(x+2, y+1) * numbers.getFloat(x+3, y) > product) {
          product = int(numbers.getFloat(x, y+3) * numbers.getFloat(x+1, y+2) * numbers.getFloat(x+2, y+1) * numbers.getFloat(x+3, y));
          a = int(numbers.getFloat(x, y+3));
          b = int(numbers.getFloat(x, y+2));
          c = int(numbers.getFloat(x, y+1));
          d = int(numbers.getFloat(x, y));
        }
      }
    }
    println(product);
    println(a + " " + b + " " + c + " " + d);
    
    //diagonal top left to bottom right
    for (int y = 0; y < rows-3; y++) {
      for (int x = 0; x < columns-3; x++) {
        if ((numbers.getFloat(x, y) * numbers.getFloat(x+1, y+1) * numbers.getFloat(x+2, y+2) * numbers.getFloat(x+3, y+3)) > product) {
          product = int(numbers.getFloat(x, y) * numbers.getFloat(x+1, y+1) * numbers.getFloat(x+2, y+2) * numbers.getFloat(x+3, y+3));
          a = int(numbers.getFloat(x, y));
          b = int(numbers.getFloat(x+1, y+1));
          c = int(numbers.getFloat(x+2, y+2));
          d = int(numbers.getFloat(x+3, y+3));
        }
      }
    }
    println(product);
    println(a + " " + b + " " + c + " " + d);
    

    shouldn't you have this outside the double for-loop with pre-defined x and y

    i have it inside cos a, b, c, d are just there so i can check the values that are being selected. dont really need them, but they need to be inside to they assume the right selected values.

  • im really new to this forum so not sure how to upload the csv but its just this:

    08, 02, 22, 97, 38, 15, 00, 40, 00, 75, 04, 05, 07, 78, 52, 12, 50, 77, 91, 08 49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48, 04, 56, 62, 00 81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30, 03, 49, 13, 36, 65 52, 70, 95, 23, 04, 60, 11, 42, 69, 24, 68, 56, 01, 32, 56, 71, 37, 02, 36, 91 22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80 24, 47, 32, 60, 99, 03, 45, 02, 44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50 32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70 67, 26, 20, 68, 02, 62, 12, 20, 95, 63, 94, 39, 63, 08, 40, 91, 66, 49, 94, 21 24, 55, 58, 05, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72 21, 36, 23, 09, 75, 00, 76, 44, 20, 45, 35, 14, 00, 61, 33, 97, 34, 31, 33, 95 78, 17, 53, 28, 22, 75, 31, 67, 15, 94, 03, 80, 04, 62, 16, 14, 09, 53, 56, 92 16, 39, 05, 42, 96, 35, 31, 47, 55, 58, 88, 24, 00, 17, 54, 24, 36, 29, 85, 57 86, 56, 00, 48, 35, 71, 89, 07, 05, 44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58 19, 80, 81, 68, 05, 94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77, 04, 89, 55, 40 04, 52, 08, 83, 97, 35, 99, 16, 07, 97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66 88, 36, 68, 87, 57, 62, 20, 72, 03, 46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69 04, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18, 08, 46, 29, 32, 40, 62, 76, 36 20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74, 04, 36, 16 20, 73, 35, 29, 78, 31, 90, 01, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 05, 54 01, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 01, 89, 19, 67, 48

  • whoops i guess the formatting didnt make it. but its just a 20 X 20 grid of numbers doesnt really matter what the numbers are, just kinda confused why it wouldnt register the diagonals

  • well im making a mess of this......sorry

  • ahh i just found my mistake. diagonal bottom left to top right should have been

         a = int(numbers.getFloat(x, y+3));
          b = int(numbers.getFloat(x+1, y+2));
          c = int(numbers.getFloat(x+2, y+1));
          d = int(numbers.getFloat(x+3, y));
    

    and processing was getting a precision error cos it was getting floats of integers which led to the numbers 89, 94, 97, 87 multiplying to 70600672 rather than 70600674 which should be the correct answer according to my calculator.

    Thanks anyways guys

Sign In or Register to comment.