2015-09-03 2 views
1

Я пытаюсь заполнить карту, которая объявлена ​​как этотКак создать карту java с этими параметрами Карта <Object, ArrayList <Object>>?

Map<Person, ArrayList<Location>> personByLocation = 
      new HashMap<String, ArrayList<Location>>(); 

Они являются Person и Location:

public class Person { 
    private Location location; 
    private String name; 

    public Person(Location location, String name) { 
     this.location = location; 
     this.name = name; 
    } 

    public Location getLocation() { 
     return location; 
    } 

    public void setLocation(Location location) { 
     this.location = location; 
    } 

    public String getName() { 
     return name; 
    } 

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

public class Location { 

    private LocationType locType; 

    private String locWeather; 

    public Location(LocationType locType, String locWeather) { 
     this.locType = locType; 
     this.locWeather = locWeather; 
    } 

    public LocationType getLocType() { 
     return locType; 
    } 

    public void setLocType(LocationType locType) { 
     this.locType = locType; 
    } 

    public String getLocWeather() { 
     return locWeather; 
    } 

    public void setLocWeather(String locWeather) { 
     this.locWeather = locWeather; 
    } 

    public enum LocationType { 

     Amsterdam, London, Wiena, Paris, Egypt; 
    } 
} 

Я пытаюсь сделать запись в этом Карта, но не сейчас, как это сделать. Если я создаю экземпляр Person и поставлю его как ключ, данные, которые запись как значение для этого ключа будут дублированы с данными для Location в ArrayList.

Вот что я сделал, но он вообще не работал.

Location location = new Location(LocationType.Paris, "sunny"); 
    Person person = new Person(new Location(LocationType.Paris, "sunny"), "Timm"); 

    for (Entry<Person, ArrayList<Location>> entry : personByLocation.entrySet()) { 
     System.out.println(entry.getKey() + " " + entry.getValue()); 
    } 
+4

'Карта > personByLocation = новый HashMap >();' не будет компилировать, я обещаю, что. – Smutje

+0

ОК. Каков правильный способ сделать это? – NoSuchUserException

+0

Зачем использовать «карту» в первую очередь? Используйте 'Set ' и извлеките места из вашего' Person's. – Mena

ответ

0

Я не предлагаю следовать рекомендациям @Mena, чтобы поместить все местоположения человека в класс Person и просто получить Set<Location> от всех ваших лиц. Это из-за seperation of concerns.

Прежде всего, вам необходимо исправить вашу копию карты.

Map<Person, List<Location>> personByLocation = new HashMap<Person, List<Location>>(); 

Второго извлеченное значение по карте имеет типа List, которые вы действительно должны перебирать снова для того, чтобы напечатать каждый элемент.

Location location = new Location(LocationType.Paris, "sunny"); 
Person person = new Person(location, "Timm"); 

for (Map.Entry<Person, List<Location>> entry : personByLocation.entrySet()) { 
    Person p = entry.getKey(); 
    List<Location> locations = entry.getValue(); 
    for(Location loc : locations) { 
     System.out.println(p + " " + loc); 
    } 
} 

При добавлении значения к карте сначала необходимо проверить, существует ли для человека запись. В противном случае вы переопределите значения, уже сохраненные для этого человека.

List<Location> myLocations = new ArrayList<Location>(); 
... 
if(personByLocation.containsKey(person)) { 
    List<Location> storedLocations = personByLocation.get(person); 
    storedLocations.addAll(myLocations); 
} else { 
    personByLocation.put(person, myLocations); 
} 
2

Кулак все ... это обыкновение компиляции:

Map<Person, ArrayList<Location>> personByLocation = new HashMap<String, ArrayList<Location>>(); 

Если объявить карту как:

Map<Person, ArrayList<Location>> personByLocation = new HashMap<Person, ArrayList<Location>>(); 

Примечание: Я думаю, дело в том, Person.location является фактическим Location из Person и List<Locations> будет маршрутом, которым человек будет заниматься.

Создать список мест и человек:

Location l1 = new Location(LocationType.Paris, "sunny"); 
Location l2 = new Location(LocationType.London, "cloudy"); 
Location l3 = new Location(LocationType.Wiena, "rain"); 

List<Location> list = new ArrayList<Location>(); 
list.add(l1); 
list.add(l2); 
list.add(l3); 

Person person = new Person(new Location(LocationType.Paris, "sunny"), "Timm"); 

Затем наполните Map:

personByLocation.put(person, list); 

Если добавить еще Person как ключ не будет заменен, вместо это, если вы возьмете человека на самом деле в списке, но с обновленными Person.location и List<Location> он будет заменен.

Примечание: также думать о замене equals() и hashCode() метод Person сущности.

+0

Да @andreas, большой улов;) –

Смежные вопросы