Skip to content
Advertisement

How to create a functioning program that acts like a calendar with methods that block multiple ranges of dates and return the available dates?

The following is what I was able to complete:

    import java.util.ArrayList;
    
    public class MyClass {    
    
      public void setBlockDates() {
      
      }
    
      public ArrayList<Integer> getAvailableDates() {
      
      }
    
      public static void main(String[] args) {
            // create an arraylist with all the dates in it
            ArrayList<Integer> dateRange = new ArrayList<Integer>();
            for (int i = 1; i < 32; i++) {
             dateRange.add(i);
            }
    
            System.out.println(dateRange);
    
      }
    }

For the setBlockDates() method: write a method to block multiple ranges of dates from the dateRange ArrayList. Here I should be able to enter multiple ranges to block, such as ([1,4], [8,11], [17,24])

For the getAvailableDates() method: write a method to return the available dates in the dateRange ArrayList created below. the return should be an ArrayList like the following if the date ranges ([1,4], [8,11], [17,24]) were blocked on the calendar:

[5, 6, 7, 12, 13, 14, 15, 16, 25, 26, 27, 28, 29, 30, 31]

Any help would be appreciated!

Advertisement

Answer

I’ll assume the input parameter for the setBlockDates() to be a two-dimensional int array.

import java.util.stream.Collectors; //for conversion to List
import java.util.stream.IntStream; //for ranges
import java.util.ArrayList;
    
public class MyClass {    
    static ArrayList<Integer> dates = new ArrayList<>(
        IntStream.rangeClosed(1, 31)
        .boxed()
        .collect(Collectors.toList())
    );
    ArrayList<Integer> blockedDates = new ArrayList<>();
    
    public void setBlockDates(int[][] arr) {
        for (int[] i : arr) {
            this.blockedDates.addAll(
                IntStream
                .rangeClosed(i[0], i[1])
                .boxed()
                .collect(Collectors.toList())
            ); //adds a range from i[0] to i[1] to blockedDates
        }
    }
    
    public ArrayList<Integer> getAvailableDates() {
        return new ArrayList(
            dates
            .stream()
            .filter(i -> !blockedDates.contains(i))
            .collect(Collectors.toList())
        );
    }
    
    public static void main(String[] args) {
        //example
        MyClass calendar = new MyClass();
        calendar.setBlockDates(new int[][] {{1, 5}, {10, 12}});
        calendar.getAvailableDates(); //returns 6-9 and 13-31 
    }
}

The setBlockDates() takes a two-dimensional array as input, and adds a range of each array to blockedDates. The getAvailableDates() returns an ArrayList<Integer> that doesn’t include all the ints in blockedDates.

User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement