2016-02-23 3 views
2

Как вы, вероятно, увидите из моего кода, я новичок в этом. Я пытаюсь написать простую программу для извлечения друзей одного человека. Вот мой код:Выполнение эквивалентности в Java

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()); 
    } 
} 

Все работает, но я не знаю, как создать метод, который будет говорить: Если Джин и друг Джона Дано, а затем четко друзья Джина будут Даны и Джон. Я знаю, что я могу добавить две строки там gina.addFriend(dana) и gina.addFriend(john), чтобы добиться того же результата, но я хотел бы знать, для чего будет этот метод. Заранее спасибо.

+2

Вы не должны использовать строки для «друзей», но в списке. – Stultuske

+1

Знаете ли вы о разных структурах данных? –

+0

Прежде всего: сохраните список друзей как «Список», а не как конкатенированную строку. (Или, поскольку один человек должен появляться только один раз, 'Set'.) Следующим шагом является то, что' a.addFriend (b); 'должен изменять наборы друзей как' a', так и 'b', а также с недружественными , – biziclop

ответ

5

Первый из все, сделать friends a ArrayList<Friend>.

private ArrayList<Friend> friends; 

Это имеет ряд преимуществ, в том числе быть проще в использовании и хранении Person S себя, а не только их имена.

Затем измените метод addFriend идти в обоих направлениях:

public void addFriend(Person friend) { 
    friends.add(friend); 
    friend.friends.add(this); 
} 

Таким образом, дружба будет автоматически вернуться назад и вперед. Вы должны также изменить unfriend:

public void unFriend(Person friend) { 
    friends.remove(friend); 
    friend.friends.remove(this); 
} 

EDIT: в соответствии с выше комментарий, набор будет на самом деле будет лучше, так как это может иметь только один из каждого значения.

0

Я предлагаю использовать массив списка лиц/друзей вместо одной строки.

ArrayList<Person> friends = new ArrayList<Person>; 

добавить друзей, набрав:

public void addFriend(Person newFriend){ 
    friends.add(newFriend); 
    newFriend.friends.add(this); 
} 

удалить друзей, набрав:

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); 
     } 
    } 
} 

показать весь список друзей:

public void showFriends(){ 
    for(int i = 0; i < this.friends.size(); i++){ 
     System.out.println(this.friends.get(i)); 
    } 
} 
+0

Спасибо за ваш ответ! Я уверен, что это работает отлично, но я еще не достиг уровня, чтобы понять все, что вы здесь написали. Поскольку я просто изучаю эти понятия, я просто хочу снова спросить, есть ли метод, который я могу написать, без изменения Sting в arrayList. Метод, который скажет, что Джина - друг Джона, тогда Джина будет другом Джона. Спасибо снова! –

+0

if (anyName1.friends.contains (anyName2) &&! AnyName2.friends.contains (anyName1)) { anyName2.friends = anyName2.friends + "" + anyName.name } Вы бы назвали это каждый раз, когда вы добавьте друга в список someones. – bloodscript

2

Я использовал бы набор и добавлял бы уникальный идентификатор человеку, чтобы обойти проблему нескольких людей с тем же именем.

Ваш класс будет выглядеть следующим образом:

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; 
    } 
} 
Смежные вопросы