0

I've implemented a Video rental service.

VideoStore class maintains an array of Video objects.

When am trying to add a new video to the inventory it inserts the new element successfully. But all elements that were previously added are no longer accessible.

Why does it happen?

public class Video {

    String videoName;
    boolean checkout;
    int rating;
    
    Video (String name){
        this.videoName=name;
    }
    
    String getName() {
        return videoName;
    }
    void doCheckout() {
        this.checkout=true;
    }
    void doReturn() {
        this.checkout=false;
    }
    void receiveRating(int rating) {
        this.rating=rating;
    }
    int getRating() {
        return rating;
    }
    boolean getCheckout() {
        return checkout;
    }
}
public class VideoStore {

    Video[] store=null;
    
    int checkVideo(String name) {
        int count =0;
        if(store==null) {
            count =0;
        }else
            for(Video video:store) {
                if(video!=null) {
                if(video.getName().equals(name))
                    count=1;
            }}
            return count;
    }
    
    void addVideo(String name) {
        int s;
        
        Video video = new Video(name);
        if(store==null)
            s=0;
        else {
            s=store.length;
        }
        
        Video[] store2 = new Video[s+1];
        store2[s]=video;
        store=store2;
    }
    
    void doCheckout(String name) {
        if(store == null || store.length==0) {
            System.out.println("Store is empty");
            return;
        }else
            for(Video video:store) {
                if(video!=null) {
                if(video.getName().equals(name))
                    video.doCheckout();
            }}
            
    }
    
    void doReturn(String name) {
        if(store == null || store.length==0) {
            System.out.println("Store is empty");
            return;
        }else
        
            for(Video video:store) {
                if(video!=null) {
                if(video.getName().equals(name))
                    video.doReturn();
            }}
    }
    void receiveRating(String name, int rating) {
        if(store == null || store.length==0) {
            System.out.println("Store is empty");
            return;
        } else
        
            for(Video video:store) {
                if(video!=null) {
                if(video.getName().equals(name))
                    video.receiveRating(rating);
            }}
        
    }
    void listInventory() {
        if(store == null || store.length==0) {
            System.out.println("Store is empty");
            return;
        }else
        
            for(Video video:store) {
                if(video!=null) {
                System.out.print("---------------------------------------------------------------------------");
                System.out.printf("\n\t%-20s\t|\t%-10s\t|\t%-15s\n", "Video Name","Checkout Status","Rating");
                System.out.printf("\n\t%-20s\t|\t%-10s\t|\t%-15s\n", video.getName(), video.getCheckout(),video.getRating());
                System.out.println("---------------------------------------------------------------------------");
            }
            }
    }
    
}
import java.util.Scanner;
public class VideoLauncher {
    
    public static void main(String[] args) {
        
        Scanner sc =new Scanner(System.in);
        int input=0;
        
        VideoStore vStore =new VideoStore();
        
        while(true) {
            System.out.println("\n1. Add Videos : "+"\n"+"2. Check Out Video : "+"\n"+"3. Return Video : "+
                       "\n"+"4. Receive Rating : "+"\n"+"5. List Inventory : "+"\n"+"6. Exit : ");
            System.out.print("Enter Your Choice (1..6) : ");
            if(!sc.hasNextInt()) {
                sc.next();
                input=0;
            } 
            String name;
            input =sc.nextInt();
            sc.nextLine();
            
            switch(input) {
            case 1:
                System.out.print("Enter the name of the video you want to add : ");
                name =sc.nextLine();
                
                vStore.addVideo(name);
                System.out.println("Video '" +name+"' added successfully.");
                
                break;
                
            case 2:
                System.out.print("Enter the name of the video you want to check out : ");
                name = sc.nextLine();if(vStore.checkVideo(name)==0) {
                    System.out.println("Video does not exist.");
                }else {
                
                    vStore.doCheckout(name);
                System.out.println("Video '"+name+"' checked out successfully.");
                }
                break;
                
            case 3:
                System.out.print("Enter the name of the video you want to return : ");
                name = sc.nextLine();
                if(vStore.checkVideo(name)==0) {
                    System.out.println("Video does not exist.");
                }else {
                    vStore.doReturn(name);
                System.out.println("Video '"+name+"' returned successfully.");
                }
                break;
                
            case 4:
                System.out.print("Enter the name of the video you want to rate : ");
                name = sc.nextLine();
                if(vStore.checkVideo(name)==0) {
                    System.out.println("Video does not exist.");
                }else {
            
                    System.out.print("Enter the rating for this video : ");
                    int rating = sc.nextInt();
                    vStore.receiveRating(name, rating);
                    System.out.println("Rating '"+rating+"' has been mapped to the Video '"+name+"'.");
                }
                break;
                
            case 5:
                vStore.listInventory();
                break;
            case 6:
                sc.close();
                System.out.print("Exiting...!! Thanks for using the application.");
                return;
            default:
                System.out.println("Please enter correct choice.");
    }}
    }
}
Dharman
  • 30,962
  • 25
  • 85
  • 135
shield
  • 53
  • 1
  • 1
  • 6

2 Answers2

0

if try to insert one more video... the previous element is deleted from inventory

That's expected, because in the method addVideo() you are not making a copy but creating a new array of a greater length and then adding a new Video object to it. That'll be the only element in the store.

To preserve all the elements that have been added previously you have to make a copy of the existing array. One of the ways to do it is to make use of the static method copyOf() of the Arrays utility class.

    public void addVideo(String name) {
        int s;

        Video video = new Video(name);
        if (store == null)
            s = 0;
        else {
            s = store.length;
        }
        Video[] store = Arrays.copyOf(store, s + 1);
        store[s]=video;
    }
Alexander Ivanchenko
  • 25,667
  • 5
  • 22
  • 46
0

Take a look at the addVideo method:

void addVideo(String name) {
    int s;
    
    Video video = new Video(name);
    if(store==null)
        s=0;
    else {
        s=store.length;
    }
    
    Video[] store2 = new Video[s+1];

    // This array only has a single item in it: the new video is at the end of the
    // array, and the rest of the array is empty.
    // Be sure to preserve the original content.
    //
    // Copying the entire array every time you add a video is not
    // very efficient, though, because it means
    // that adding a new video will always be an O(n) operation, so you may want to
    // consider an alternative implementation here.
    store2[s]=video;

    // You replace the entire array here
    store=store2;
}

In this method, you replace the original array every time with an array that contains only the video you just added.

Also, as I mentioned in the code comments, an array is a somewhat suboptimal data structure here because it means that adding or checking out videos are both O(n) operations. You may want to consider a hash table instead.