[英]Making an equivalence in Java
As you will probably see from my code I'm quite new with this. 正如您可能从我的代码中看到的那样,我对此很新。 I am trying to write a simple program to retrieve the friends of one person. 我正在尝试编写一个简单的程序来检索一个人的朋友。 Here is my code: 这是我的代码:
public class Person {
private String name;
private String friends;
public Person(String aName) {
name = aName;
friends = "";
}
public String getFriends() {
return friends;
}
public void addFriend(Person friend) {
friends = friends + " " + friend.name;
}
public void unfriend(Person nonFriend) {
friends = friends.replace(" " + nonFriend.name, "");
}
public static void main(String[] args) {
Person dana = new Person("Dana");
Person gina = new Person("Gina");
Person john = new Person("John");
dana.addFriend(gina);
dana.addFriend(john);
john.addFriend(gina);
john.addFriend(dana);
john.unfriend(dana);
System.out.println("Dana's friends are: " + dana.getFriends());
System.out.println("Gina's friends are: " + gina.getFriends());
System.out.println("John's friends are: " + john.getFriends());
}
}
Everything works, but I do not know how to create a method that will say: If Gina is both Dana's and John's friend then clearly Gina's friends will be Dana and John. 一切正常,但我不知道如何创造一种方法可以说:如果Gina既是Dana和John的朋友,那么显然Gina的朋友将是Dana和John。 I know that I can add two lines there gina.addFriend(dana)
and gina.addFriend(john)
, to accomplish the same result, but I would like to know what will the method be for that. 我知道我可以在gina.addFriend(dana)
和gina.addFriend(john)
添加两行来完成相同的结果,但我想知道该方法的用途。 Thanks in advance. 提前致谢。
First of all, make friends
an ArrayList<Friend>
. 首先, friends
一个ArrayList<Friend>
。
private ArrayList<Friend> friends;
This has several advantages, including being easier to use and storing the Person
s themselves rather than just their names. 这有几个优点,包括更容易使用和存储Person
本身而不仅仅是他们的名字。
Then, change the addFriend
method to go in both directions: 然后,将addFriend
方法更改为双向:
public void addFriend(Person friend) {
friends.add(friend);
friend.friends.add(this);
}
In this way, friendships will automatically go back and forth. 通过这种方式,友谊将自动来回传递。 You should also change unfriend
: 你也应该改变unfriend
:
public void unFriend(Person friend) {
friends.remove(friend);
friend.friends.remove(this);
}
EDIT: as per a comment above, a set would actually be better, as it can only have one of each value. 编辑:根据上面的评论,一组实际上会更好,因为它只能有一个值。
I would use a Set, and add a unique Id to person to get around the problem of multiple people having the same name. 我会使用一个Set,并为人们添加一个唯一的ID来解决多个人具有相同名称的问题。
Your class will then look like: 您的课程将如下所示:
public class Person
{
private final String personId;
private final String name;
private final Set<Person> friends;
public Person(String personId, String name) {
super();
this.personId = personId;
this.name = name;
this.friends = new HashSet<Person>();
}
public void addFriend(Person friend) {
if(friend != null && !friends.contains(friend)) {
this.friends.add(friend);
// Optional : if it is a two-way relationship that doesn't need approving etc
friend.addFriend(this);
}
}
public void unfriend(Person nonFriend)
{
if(nonFriend != null && friends.contains(nonFriend)) {
this.friends.remove(nonFriend);
// Optional : if it is a two-way relationship that doesn't need approving etc
nonFriend.unfriend(this);
}
}
public Set<Person> getFriends()
{
return friends;
}
@Override
public String toString() {
return "Person [name=" + name + "]";
}
public static void main(String[] args)
{
Person dana = new Person("D001", "Dana");
Person gina = new Person("G001", "Gina");
Person john = new Person("J001", "John");
dana.addFriend(gina);
dana.addFriend(john);
john.addFriend(gina);
john.addFriend(dana);
john.unfriend(dana);
System.out.println("Dana's friends are: "+dana.getFriends());
System.out.println("Gina's friends are: "+gina.getFriends());
System.out.println("John's friends are: "+john.getFriends());
}
// Equals and Hashcode are very important when using 'contains' and other Set-based methods
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((personId == null) ? 0 : personId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (personId == null) {
if (other.personId != null)
return false;
} else if (!personId.equals(other.personId))
return false;
return true;
}
}
i would suggest to use an arrayList of persons/friends instead of one string. 我建议使用一个人/朋友的arrayList而不是一个字符串。
ArrayList<Person> friends = new ArrayList<Person>;
you add friends by typing: 您输入以下内容添加朋友:
public void addFriend(Person newFriend){
friends.add(newFriend);
newFriend.friends.add(this);
}
you delete friends by typing: 你输入以下内容删除朋友:
public void unfriend(Person noFriend){
for(int i = 0; i < this.friends.size(); i++){
if(this.friends.get(i).name.equals(noFriend.name){
this.friends.delete(i);
}
}
for(int i = 0; i < noFriend.friends.size(); i++){
if(noFriend.friends.get(i).name.equals(this.name){
noFriend.friends.delete(i);
}
}
}
to show the whole list of friends: 显示整个朋友列表:
public void showFriends(){
for(int i = 0; i < this.friends.size(); i++){
System.out.println(this.friends.get(i));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.