简体   繁体   English

在Java中实现等价

[英]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.

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