(Плохо) реализация с помощью HashMap
Прежде всего, вы хотите, класс, представляющий каждый человек, у вас есть, со списком для размещения своих друзей:
public class Person {
String name;
// For identification purposes.
public Person(String name) {
this.name = name;
}
HashMap<String, Person> friends = new HashMap<String, Person>();
}
Теперь вы хотите добавить следующее методы для этого класса, чтобы вы могли добавлять/удалять друзей:
public void addFriend(Person person) {
if (friends.get(person.name) == null) friends.put(person.name, person);
person.friends.put(name, this);
}
public void removeFriend(Person person) {
if (friends.get(person.name) != null) friends.remove(person.name);
person.friends.remove(name);
}
// Only add this to test and see the list of friends.
public void printFriends() {
System.out.println(name + "'s Friends:");
for (Person p : friends.values()) {
System.out.println(" " + p.name);
}
}
Thats your person setup! Теперь вам нужно начать использовать вновь созданных людей!
public class PersonTest {
public static void main(String[] args) {
Person johndoe = new Person("John Doe");
Person janedoe = new Person("Jane Doe");
Person danedoe = new Person("Dane Doe");
johndoe.addFriend(janedoe);
janedoe.addFriend(danedoe);
johndoe.printFriends();
janedoe.printFriends();
danedoe.printFriends();
}
}
Выход: (отформатированный для Stack биржи)
John Doe Друзья:
* Jane Doe
Jane Doe Друзья:
* John Doe
* Dane Doe
Друзья Dane Doe:
* Jane Doe
(Лучше) реализация с использованием HashMap и UUID.
При необходимости необходимо изменить/сформировать класс Person
. Единственная причина, по которой name
существует в предыдущей реализации, заключается в том, чтобы идентифицировать человека в HashMap. Проблема в этом состоит в том, что могут существовать два «Джона Смита». Добавление во втором Джоне будет перезаписано предыдущей итерацией. Поэтому вы должны изменить name
в addFriend()
и removeFriend()
на UUID, сгенерированный для человека вместо этого.
public class Person {
String uuid = UUID.randomUUID().toString();
HashMap<String, Person> friends = new HashMap<String, Person>();
public void addFriend(Person person) {
if (friends.get(person.uuid) == null) friends.put(person.uuid, person);
person.friends.put(uuid, this);
}
public void removeFriend(Person person) {
if (friends.get(person.uuid) != null) friends.remove(person.uuid);
person.friends.remove(uuid);
}
public void printFriends() {
System.out.println(uuid + "'s Friends:");
for (Person p : friends.values()) {
System.out.println(" " + p.uuid);
}
}
}
(Best) реализация с использованием HashSet непосредственно
Хотя выше двух реализаций работы *, они привносят вредные привычки программирования, и жевать производительность (хотя и небольшой). Использование HashSet
полностью устраняет необходимость включения UUID или любой другой формы идентификатора, так как Set
может быть передан с непосредственно без использования ключа.
* первая реализация не имеет дублирующей обработки.
public class Person {
String name;
public Person(String name) {this.name = name;}
Set<Person> friends = new HashSet<Person>();
public void addFriend(Person person) {
friends.add(person);
person.friends.add(this);
}
public void removeFriend(Person person) {
friends.remove(person);
person.friends.remove(this);
}
public void printFriends() {
System.out.println(name + "'s Friends:");
for (Person p : friends) {
System.out.println(" " + p.name);
}
}
}
PS: PersonTest
класс работает универсально для всех 3-х реализаций.
Для «брака» попробуйте использовать HashMap. – finnrayment
https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html – finnrayment
Вы ведете оба списка, а не только один? –