Arrays

Lesson 4 - Arrays

  • arrays

  • math.random

Arrays

public class Main{
    public static void main(String[] args) {
        int[] arr = {10, 20, 30, 40, 50, 60, 70, 80 ,90, 100};
        System.out.println("array size is: " + arr.length);

        System.out.print("values are: ");

        for (int i = 0; i < arr.length; i++)
            System.out.print(arr[i] + " ,");
    }
}
array size is: 10
values are: 10 ,20 ,30 ,40 ,50 ,60 ,70 ,80 ,90 ,100 ,

these are all the same

        int[] arr = {10, 20, 30, 40, 50, 60, 70, 80 ,90, 100};
        int[] arr2 = new int[]{10, 20, 30, 40, 50, 60, 70, 80 ,90, 100};

        int[] arr3 = new int[10];

        for (int i = 1; i <= arr3.length; i++)
            arr3[i-1] = i*10;
  • here we used arr3[i-1] since the first index starts from 0 but are for loops starts from 1

  • int[] arr3 = new int[10]; we must explicitly to define the size to 10 since we can't infer the the size at the beginning

cool way to visualize

public class Main{
    public static void main(String[] args) {
        int[] arr = {10, 20, 30, 40, 50, 60, 70, 80 ,90, 100};

        System.out.println("-".repeat(arr.length*5));

        for (int i = 0; i < arr.length; i++)
            System.out.print("| " + i + "  ");

        System.out.print(" | <- Indices\n");
        System.out.println("-".repeat(arr.length*5));

        for (int i = 0; i < arr.length; i++)
            System.out.print("| " + arr[i] + " ");

        System.out.print("| <- Values\n");
        System.out.println("-".repeat(arr.length*5));
    }
}
----------------------------------------------------
| 0  | 1  | 2  | 3  | 4  | 5  | 6  | 7  | 8  | 9   | <- Indices
----------------------------------------------------
| 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 | <- Values
----------------------------------------------------

Warm Up I ⭐

בהינתן מערך חשב את הסכום של האיבר עם הקודמים לו

ex.

original:   1 | 2 | 3 | 4  | 5  | 6
new array:  1 | 3 | 6 | 10 | 15 | 21

explanation:

public class Main{
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6};

        for (int i = 1; i < arr.length; i++)
            arr[i]+=arr[i-1]; // same as arr[i]= arr[i] + arr[i-1]

        for (int i = 0; i < arr.length; i++)
            System.out.print(" | " + arr[i]);
    }
}
 | 1 | 3 | 6 | 10 | 15 | 21

Warm Up II ⭐

Read n number of values in an array and display it in reverse order:

public class Main{
    public static void main(String[] args) {
        int n;
        while ((n = MyConsole.readInt("enter number of elements: "))<0)
            System.out.println("you entered a negative number");

        int[] arr = new int[n];

        for (int i = 0; i < n; i++)
            arr[i] = MyConsole.readInt("enter num"+ i + ": ");

        System.out.print("original: ");
        for (int i = 0; i < n; i++)
            System.out.print(arr[i] + " ,");

        System.out.print("\nreversed: ");
        for (int i = n-1; i >= 0; i--)
            System.out.print(arr[i] + " ,");

    }
}
enter number of elements:  4
enter num0:  2
enter num1:  4
enter num2:  6
enter num3:  8
original: 2 ,4 ,6 ,8 ,
reversed: 8 ,6 ,4 ,2 ,

now copy those values in reverse

עכשיו תעתיקו את המערך הפוך למערך אחר

public class Main{
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6};
        int[] new_arr = new int[arr.length];


        for (int i = arr.length-1; i >= 0; i--) {
            new_arr[arr.length - 1 - i] = arr[i];
        }

        for (int i = 0; i < new_arr.length; i++) {
            System.out.print(new_arr[i] + " | ");
        }

    }
}

Find The max, min, avg and 2nd largest

  • עכשיו במקום להכניס n מספרים הוא יגריל n מספרים

  • בנוסף הוא ימצא את המינ' המקסימום וגם השני הגדול ביותר

  • יודפס גם האיבר ממוצע

ex.

how many elements:  10
min:  100
max:  999

array:
----------------------------------------------------------------------
| 430  | 900  | 136  | 560  | 999  | 604  | 658  | 413  | 481  | 374  
----------------------------------------------------------------------

max value: 999
2nd largest value: 900
min value: 136
avg value: 555

solution:

public class Main{
    public static void main(String[] args) {
        int n = MyConsole.readInt("how many elements: ");
        int[] arr = new int[n];
        int min_rand = MyConsole.readInt("min: ");
        int max_rand = MyConsole.readInt("max: ");

        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        int sum=0;

        //fill in array with random numbers
        for (int i = 0; i < n; i++)
            arr[i] = (int) ((Math.random() * ((max_rand+1) - min_rand)) + min_rand);

        //find max and min numbers
        System.out.println("\narray:\n" + "-".repeat(n*7));
        for (int i = 0; i < n; i++){
            System.out.print("| " + arr[i] + "  ");
            sum+=arr[i];

            max = Math.max(max, arr[i]); //one way to find max

            if (arr[i] < min) //one way to find min
                min = arr[i];
        }
        System.out.println("\n" + "-".repeat(n*7));


        //find 2nd largest
        int second_largest = Integer.MIN_VALUE;
        for (int i = 0; i < n; i++) {
            if (second_largest< arr[i] && arr[i]!=max)
                second_largest= arr[i];
        }

        System.out.println("\nmax value: " + max);
        System.out.println("2nd largest value: " + second_largest);
        System.out.println("min value: " + min);
        System.out.println("avg value: " + sum/n);


    }
}
how many elements:  10
min:  100
max:  999

array:
----------------------------------------------------------------------
| 430  | 900  | 136  | 560  | 936  | 604  | 658  | 413  | 481  | 374  
----------------------------------------------------------------------

max value: 936
2nd largest value: 900
min value: 136
avg value: 555

Duplicate elements ⭐⭐⭐

ספרו כמה פעמים שי ערכים שחוזרים על עצמם

-----------------------
| 5 | 2 | 7 | 7 | 5 | 7
-----------------------

duplicate elements: 3

Watch out not to double count duplicates

import java.util.Arrays;

public class Main{
    public static void main(String[] args) {
        int[] arr = {5, 2, 7, 7, 5, 7};
        int cntr = 0;
        boolean[] marked = new boolean[arr.length];
        Arrays.fill(marked, false); // fills array with value


        for (int i = 0; i < arr.length; i++)
            for (int j = i+1; j < arr.length; j++)
                if (arr[i] == arr[j] && marked[j] == false){
                    ++cntr;
                    marked[j] = true;
                }

        System.out.println("duplicate elements: " + cntr);
    }
}
duplicate elements: 3

Note: we could also write !marked[j] instead of marked[j] == false

Simpler version

import java.util.Arrays;

public class Main{
    public static void main(String[] args) {
        int[] arr = {5, 2, 7, 7, 5, 7};
        int cntr = 0;

        for (int i = 0; i < arr.length; i++)
            for (int j = i+1; j < arr.length; j++)
                if (arr[i] == arr[j]){
                    ++cntr;
                    break;
                }

        System.out.println("duplicate elements: " + cntr);
    }
}
duplicate elements: 3

This also works and we wont count twice (or more) since we break before reaching the other doubles. By breaking we prevented ourselves from counting more than we should

version 2.1

now print the duplicate values as well

ex.

| 5  | 2  | 7  | 7  | 5  | 7  

num of duplicate elements: 3
duplicates: | 5  | 7  | 7
import java.util.Arrays;

public class Main{
    public static void main(String[] args) {
        int[] arr = {5, 2, 7, 7, 5, 7};
        int cntr = 0;
        boolean[] marked = new boolean[arr.length];
        int[] duplicates = new int[arr.length];
        int duplicateIndex = 0;

        Arrays.fill(marked, false);
        Arrays.fill(duplicates, 0);

        for (int i = 0; i < arr.length; i++)
            System.out.print("| " + arr[i] + "  ");
        System.out.println("\n");

        for (int i = 0; i < arr.length; i++)
            for (int j = i+1; j < arr.length; j++)
                if (arr[i] == arr[j] && !marked[j]){
                    ++cntr;
                    marked[j] = true;
                    duplicates[duplicateIndex++] = arr[j];
                }

        System.out.println("num of duplicate elements: " + cntr);

        System.out.print("duplicates: ");
        for (int i = 0; i < duplicateIndex; i++)
            System.out.print("| " + duplicates[i] + "  ");

    }
}
| 5  | 2  | 7  | 7  | 5  | 7  

num of duplicate elements: 3
duplicates: | 5  | 7  | 7

Sorting array - Bubble Sort ⭐⭐

https://youtu.be/xli_FI7CuzA - link to youtube explanation

public class Main{
    public static void main(String[] args) {
        int n = MyConsole.readInt("how many elements: ");
        int[] arr = new int[n];
        int min_rand = MyConsole.readInt("min: ");
        int max_rand = MyConsole.readInt("max: ");

        int digit_space = (int) Math.log10(max_rand) + 1 + 2;

        //fill in array
        for (int i = 0; i < n; i++)
            arr[i] = (int) ((Math.random() * ((max_rand+1) - min_rand)) + min_rand);

        //print original array
        System.out.println("\noriginal\n" + "-".repeat(n*digit_space));
        for (int i = 0; i < n; i++)
            System.out.print("| " + arr[i] + " ");
        System.out.println("\n" + "-".repeat(n*digit_space));

        //interesting stuff starts here
        for (int i = 0; i < arr.length; i++)
            for (int j = 0; j < arr.length-i-1; j++)
                if (arr[j] > arr[j+1]) {
                    // swap arr[j+1] and arr[j]
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }

        //print sorted array
        System.out.println();
        System.out.println("sorted\n" + "-".repeat(n*digit_space));
        for (int i = 0; i < n; i++)
            System.out.print("| " + arr[i] + " ");
        System.out.println("\n" + "-".repeat(n*digit_space));
    }
}
how many elements:  10
min:  100
max:  2000

original
------------------------------------------------------------------------
| 438  | 897  | 863  | 608  | 371  | 1581  | 1885  | 480  | 1538  | 751  
------------------------------------------------------------------------

sorted
------------------------------------------------------------------------
| 371  | 438  | 480  | 608  | 751  | 863  | 897  | 1538  | 1581  | 1885  
------------------------------------------------------------------------

Time Complexity of Bubble sort is: O(n^2) so it isn't often used

use: System.out.print((i%15==0 && i!=0 ?"\n" : "") + "| " + arr[i] + " "); for a nicer print

Adding a number to array

how many elements:  5

original
------------------------------
| 43  | 93  | 41  | 61  | 57  
-----------------------------
enter new num:  100
where to add, from 0 to 5: 2

after adding num
-------------------------------------
| 43  | 93  | 100  | 41  | 61  | 57  
------------------------------------
public class Main{
    public static void main(String[] args) {
        int n = MyConsole.readInt("how many elements: ");
        int[] arr = new int[n];
        int min_rand = 10;
        int max_rand = 99;

        //fill in array
        for (int i = 0; i < n; i++)
            arr[i] = (int) ((Math.random() * ((max_rand+1) - min_rand)) + min_rand);

        //print original array
        System.out.println("\noriginal\n----------------------------------------------------");
        for (int i = 0; i < n; i++)
            System.out.print("| " + arr[i] + "  ");
        System.out.println("\n----------------------------------------------------");

        //add number
        int newNum = MyConsole.readInt("enter new num: ");
        int index;
        while ((index= MyConsole.readInt("where to add, from 0 to "+ n+ ": ")) >n || index<0)
            System.out.println("the number is not a valid index");

        //interesting stuff
        int[] new_arr = new int[n+1];
        for (int i = 0; i < index; i++)
            new_arr[i] = arr[i];

        new_arr[index] = newNum;

        for (int i = index+1; i < n+1; i++)
            new_arr[i] = arr[i-1];



        //print sorted array
        System.out.println();
        System.out.println("after adding num\n----------------------------------------------------");
        for (int i = 0; i < n+1; i++)
            System.out.print("| " + new_arr[i] + "  ");
        System.out.println("\n----------------------------------------------------");
    }
}

Remove Elements from array

public class Main{
    public static void main(String[] args) {
        int n = MyConsole.readInt("how many elements: ");
        int[] arr = new int[n];
        int min_rand = 1;
        int max_rand = 4;

        //fill in array with random numbers
        for (int i = 0; i < n; i++)
            arr[i] = (int) ((Math.random() * ((max_rand+1) - min_rand)) + min_rand);

        //print array
        System.out.println("array:");
        System.out.println("-".repeat(n*5));
        for (int i = 0; i < n; i++)
            System.out.print("| " + arr[i] + "  ");
        System.out.println("\n" + "-".repeat(n*5));

        //here we start
        int num2remove = MyConsole.readInt("whom to remove: ");
        int countRemaining = 0;

        //count elements that we will leave
        for (int i = 0; i < n ; i++)
            if (arr[i]!=num2remove)
                countRemaining++;

        int[] arr_remaining = new int[countRemaining];
        int remainingIndex = 0;

        for (int i = 0; i < n; i++){
            if (arr[i]!=num2remove){
                arr_remaining[remainingIndex] = arr[i];
                ++remainingIndex;
            }
        }

        //print array
        System.out.println("array:");
        System.out.println("-".repeat(countRemaining*5));
        for (int i = 0; i < arr_remaining.length; i++)
            System.out.print("| " + arr_remaining[i] + "  ");
        System.out.println("\n"+ "-".repeat(countRemaining*5));
    }
}
how many elements:  10
array:
--------------------------------------------------
| 4  | 4  | 2  | 3  | 4  | 1  | 1  | 3  | 1  | 4  
--------------------------------------------------
whom to remove:  4
array:
------------------------------
| 2  | 3  | 1  | 1  | 3  | 1  
------------------------------

הדפסת משולשים

version 2

public class Main{
    public static void main(String[] args) {
        int n = 4;

        for (int i = 0; i < n; i++)
            System.out.println("*".repeat(i));

        for (int i = n-1; i > 0; i--)
            System.out.println("*".repeat(i));
    }
}
*
**
***
***
**
*

If we have time

check if an array can be splitted such that the sum of left side of the splitting is equal to the sum of the right side

Last updated