/*************************************************************************
Reference solution for Spring 2013 COS 126 Programming Exam 2: Person
Author: COS 126 Staff
Netid: cos126
Precepts: lots of them
Dependencies: Stack, Queue, StdOut
Description: Models a person, a list of messages that they can
read, and a list of their friends, so that when you
post a message, all your friends can read it too.
**************************************************************************/
public class Person {
private String name;
private Queue<Person> friends; // Stack or Queue, doesn't matter
private Stack<String> wall; // Stack, so newest is iterated first
// Create a new Person with this name.
public Person(String name) {
this.name = name;
this.friends = new Queue<Person>();
this.wall = new Stack<String>();
}
// Make these two people become friends with each other.
// Throw an exception if you try to meet yourself.
// We are allowed to assume we didn't meet this person yet.
public void meet(Person otherPerson) {
if (otherPerson == this)
throw new RuntimeException("You can't meet yourself");
friends.enqueue(otherPerson); // remember this friend
otherPerson.friends.enqueue(this); // reciprocate
}
// Are these two people friends?
// Throw an exception if you ask about knowing yourself.
public boolean knows(Person otherPerson) {
if (otherPerson == this)
throw new RuntimeException("You can't call knows() on yourself");
// Search through all my friends
for (Person p : friends) {
if (p == otherPerson)
return true;
}
// If otherPerson was not found, I don't know them
return false;
}
// Post a message to my list and the lists of all my friends
public void post(String message) {
wall.push(message); // add to my own list
for (Person p : friends)
p.wall.push(message); // and to each friend's
}
// Print a header, then all messages this Person can read, newest first
public void listMessages() {
// header
StdOut.println("== The wall of " + name + " ==");
// Iterate through all messages and print them
for (String s : wall)
StdOut.println(s);
}
}