0

I have written this code:

public class ArraLists {
    public static void main(String[] args) {
        ArrayList<Amphitheater> amphitheaters= new ArrayList<Amphitheater>();

            Amphitheater a1 = new Amphitheater("Amph 2");
            Amphitheater a2 = new Amphitheater("Amph 3"); 
            Amphitheater a3 = new Amphitheater("Amph 8");
            Amphitheater a4 = new Amphitheater("Amph 9");
            Amphitheater a5 = new Amphitheater("Amph 11");
            Amphitheater a6 = new Amphitheater("Amph 10");
            Amphitheater a7 = new Amphitheater("Amph 12");
            Amphitheater a8 = new Amphitheater("Amph 13");

            Course cC1 = new Course("Math","M123");

            amphitheaters.add(a1);
            amphitheaters.add(a2);
            amphitheaters.add(a3);
            amphitheaters.add(a4);
            amphitheaters.add(a5);
            amphitheaters.add(a6);
            amphitheaters.add(a7);
            amphitheaters.add(a8);

            DateExamination d1= new DateExamination("03 May",amphitheaters);
            DateExamination d2= new DateExamination("04 May",amphitheaters);

            ArrayList<Amphitheater> amph1= d1.getAmphitheaters();
            ArrayList<Amphitheater> amph2= d2.getAmphitheaters();

            amph2.get(1).addCourse(1,cC1);

            System.out.println("Amphitheaters of D1");
            for(Amphitheater a: amph1) {
               System.out.println(a.getName());
               System.out.println(a.getAvailableHours());
            }

            System.out.println("Amphitheaters of D2");

            for(Amphitheater a: amph2) {
              System.out.println(a.getName());
              System.out.println(a.getAvailableHours());
            }

            System.out.println("\n\nList of Amphitheaters that I created in Main.");

            for(Amphitheater a: amphitheaters) {
              System.out.println(a.getName());
              System.out.println(a.getAvailableHours());
            }   
      }
}


public class Course {

    private String name;
    private String id;

    private ArrayList<Amphitheater> amphitheaters= new ArrayList<Amphitheater>();
    private ArrayList<Integer> hours= new ArrayList<Integer>();

    public Course(String name, String id){
        this.name=name;
        this.id=id;
    }

    public void addAmphitheater(Amphitheater amphitheater,int hour){
        amphitheaters.add(amphitheater);
        hours.add(hour);
    }
}




public class Amphitheater{

    private String name;
    private HashMap<Integer,Boolean> availableHours=new HashMap<Integer,Boolean>(); //Hour,Available
    private HashMap<Integer,Course> courses= new HashMap<Integer,Course>(); //Hour,Course

    public Amphitheater(String name){
        this.name=name;
        for(int i=0; i<5; i++){
           availableHours.put(i,true);
           courses.put(i,null);
        }
    }
    public boolean isHourAvailable(Integer hour){
        return availableHours.get(hour);
    }

    public ArrayList<Integer> getAvailableHours(){
        ArrayList<Integer> avHours= new ArrayList<Integer>();
        for(int i=0; i<5; i++){
            if(availableHours.get(i))
               avHours.add(i);
            }
            return avHours;
        }

    public void addCourse(Integer hour,Course course){
        courses.put(hour,course);
        availableHours.put(hour, false);
        course.addAmphitheater(this,hour);

    }

    public void setName(String name){
        this.name=name;
    }

    public String getName(){
        return name;
    }

}






public class DateExamination{

    private ArrayList<Amphitheater> amphitheaters;
    private String name;

    public DateExamination(String name,ArrayList<Amphitheater> amphitheaters) {
        this.name=name;
        this.amphitheaters=amphitheaters;
    }

    public ArrayList<Amphitheater> getAmphitheaters(){
        return amphitheaters;
    }

}

I pass as an argument to DateExamination objects the ArrayList with amphitheaters.

The problem is, when I change a value to the amphitheaters of d1 (DateExamination), automatically the same value is changed to the amphitheaters of d2 (DateExamination).

Also, the ArrayList that I created in Main is changed. I think that all the ArrayList's has references to the same objects, but I really can't understand.

I want each object of DateExamination has an ArrayList of amphitheaters which will be independent of the others amphitheaters.

I also tried to pass as an argument a .clone() of this ArrayList but has no result.

J-Alex
  • 6,881
  • 10
  • 46
  • 64
OrestisNer
  • 11
  • 3
  • Not sure if this would count as a duplicate question, but check out https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value – Zircon May 26 '17 at 16:14
  • See also [Pitfall: Thinking of variables as objects](https://stackoverflow.com/documentation/java/4388/common-java-pitfalls/24130) in stackoverflow documentation. – Andy Thomas May 28 '17 at 16:50

1 Answers1

0

This is because they both have the same Objects in them, you would need to create a new instance of each object instead.

    ArrayList<Amphitheater> amphitheaters= new ArrayList<>();
    ArrayList<Amphitheater> amphitheaters1= new ArrayList<>();

    Course cC1 = new Course("Math","M123");

    amphitheaters.add(new Amphitheater("Amph 2"));
    amphitheaters.add(new Amphitheater("Amph 3"));
    amphitheaters.add(new Amphitheater("Amph 8"));
    amphitheaters.add(new Amphitheater("Amph 9"));
    amphitheaters.add(new Amphitheater("Amph 11"));
    amphitheaters.add(new Amphitheater("Amph 10"));
    amphitheaters.add(new Amphitheater("Amph 12"));
    amphitheaters.add(new Amphitheater("Amph 13"));

    amphitheaters1.add(new Amphitheater("Amph 2"));
    amphitheaters1.add(new Amphitheater("Amph 3"));
    amphitheaters1.add(new Amphitheater("Amph 8"));
    amphitheaters1.add(new Amphitheater("Amph 9"));
    amphitheaters1.add(new Amphitheater("Amph 11"));
    amphitheaters1.add(new Amphitheater("Amph 10"));
    amphitheaters1.add(new Amphitheater("Amph 12"));
    amphitheaters1.add(new Amphitheater("Amph 13"));



    DateExamination d1= new DateExamination("03 May", new ArrayList<>(amphitheaters));
    DateExamination d2= new DateExamination("04 May", new ArrayList<>(amphitheaters1));

This is a dirty hack to get around it, but it will work for your case if thats only you need this one time.

jkeys
  • 431
  • 3
  • 10
  • It's not only for one time. I want every time user want to "create" an object DateExamination , automatically this object got this ArrayList. I wrote it this way, for simplicity. Anyway, thank you! – OrestisNer May 26 '17 at 16:41