简体   繁体   中英

In Java, how do you create an ArrayList, with one element of that list being another ArrayList, that is unique for each element?

So for example.

I have an ArrayList of people. Created through a people object that contains a name, address, age, etc.

How would I then add another list to that, allowing a unique list of hobbies for each person?

So I could have:

  • James, 32, England, (Football, Tennis)
  • Chloe, 21, Wales, (Art)

Tried a few things and struggling with it.

import java.util.ArrayList;

public class People {
    int id;
    String name;
    ArrayList<String> hobbies;

    public People(int id, String name, ArrayList<String> hobbies) {
        this.id = id;
        this.name = name;
        this.hobbies = hobbies;
    }

    public People(String name) {
        this.name = name;
    }

    public People() {
        // TODO Auto-generated constructor stub
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "People [id=" + id + ", name=" + name + ", hobbies=" + hobbies + "]";
    }
}

import java.util.ArrayList;

public class Runner {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList<People> arrayPeople = new ArrayList<>();
        ArrayList<String> hobbies = new ArrayList<>();
        hobbies.add("Football");
        hobbies.add("Tennis");
        arrayPeople.add(new People(1,"Paul", hobbies));
        hobbies.add("Golf");
        arrayPeople.add(new People(2,"James", hobbies));

        System.out.println(arrayPeople);
    }
}

This creates a hobby list that is the same for each person, not unique.

This creates a hobby list that is the same for each person, not unique.

That's because member hobbies in [ Paul ] People object has same value as member hobbies in [ James ] People object, since they are assigned the same value in method main of class Runner . Hence when you change hobbies variable, in method main of class Runner , you are changing for both Paul and James .

The simplest solution is to change the class constructor so that it creates a copy of the hobbies parameter and assigns the copy to the hobbies member:

public People(int id, String name, List<String> hobbies) {
    this.id = id;
    this.name = name;
    this.hobbies = new ArrayList<>(hobbies);
}

However, I suggest that you add methods to class People to manipulate hobbies member, including:

  • addHobby for adding a hobby
  • removeHobby for removing a hobby
  • clearHobbies for removing all hobbies
  • getHobbies that returns a copy of hobbies (so that code that calls the method cannot change hobbies )

Below code demonstrates.
Note that you should always use the interface – in this case java.util.List – rather than the implementation – in this case ArrayList – in the API so that you can change class People without having to change its API. If you change the API of class People then all other classes that use class People – like class Runner in the code in your question – will need to be changed as well.

import java.util.ArrayList;
import java.util.List;

public class People {
    private int id;
    private String name;
    private List<String> hobbies;

    public People(int id, String name, List<String> hobbies) {
        this.id = id;
        this.name = name;
        this.hobbies = new ArrayList<>(hobbies);
    }

    public People(int id, String name) {
        this(id, name, new ArrayList<String>());
    }

    public People() {
        this(0, "");
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public void addHobby(String hobby) {
        if (!hobbies.contains(hobby)) {
            hobbies.add(hobby);
        }
    }

    public void clearHobbies() {
        hobbies.clear();
    }

    public List<String> getHobbies() {
        return List.of(hobbies.toArray(new String[]{}));
    }

    public void removeHobby(String hobby) {
        if (hobbies.contains(hobby)) {
            hobbies.remove(hobby);
        }
    }

    @Override
    public String toString() {
        return "People [id=" + id + ", name=" + name + ", hobbies=" + hobbies + "]";
    }

    public static void main(String[] args) {
        List<People> arrayPeople = new ArrayList<>();
        People paul = new People(1,"Paul");
        paul.addHobby("Football");
        paul.addHobby("Tennis");
        People james = new People(2,"James");
        james.addHobby("Football");
        james.addHobby("Tennis");
        james.addHobby("Golf");
        arrayPeople.add(paul);
        arrayPeople.add(james);

        System.out.println(arrayPeople);
    }
}

Running the above code prints the following:

[People [id=1, name=Paul, hobbies=[Football, Tennis]], People [id=2, name=James, hobbies=[Football, Tennis, Golf]]]

The question seemed unclear to me, however I assume that you created lists such as

[name,age,location]

However, this is not an object . If you create a person object , you can add features inside it. So that when you create a person object, then you will have access to add/edit new features. In your case, your features must be:

  • Name
  • Age
  • Location
  • List (Whatever you name it, type of it must be an arraylist).

To have a list of people:

class Person{
    String name;
    int age;
    String Address;
    ...
}

and ArrayList<Person>

For the people class, if you need each hobby in hobbies to be unique you can have a Set class to store hobbies.

class Person{
    String name;
    int age;
    String address;
    Set<String> hobbies;
    ...
}

If the order does not matter you can use HashSet To maintain the order you can use TreeSet or LinkedHashSet.

class person{
    String name;
    int age;
    String address;
    TreeSet<String> hobbies;
    ...
}
class Person{
    String name;
    int age;
    String address;
    LinkedHashSet<String> hobbies;
    ...
}

To add a hobby to a person.

String hobby = "a hobby";
person.add(hobby);

To add hobbies to a person;

String hobby1 = "hobby1";
String hobby1 = "hobby2";
...
Set<String> hobbies = new TreeSet(); // or Set<String> hobbies = new LinkedHashMap();
hobbies.add(hobby1);
hobbies.add(hobby2);
...
person.addAll(hobby);

For another person with the same hobbies, you need to copy the hobbies, then modifying the hobbies of the second person will not affect the hobbies of the first person.

Set<String> new_hobbies = new TreeSet(old_hobbies); // or new LinkedHashSet(old_hobbies);
another_person.addAll(new_hobbies);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM