Tuesday, October 19, 2010

HW5 Solution

Below is my solution to this homework:
package hw5;

public class Person {
 
 /** The person's full name */
 private String name;
 
 public enum Status {MARRIED, SINGLE, UNKNOWN, ITS_COMPLICATED};
 
 private Status status;
 
 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 private FriendsList friends;
 
 private Wall wall;
 
 public Person() {
  this("",Status.UNKNOWN);
 }
 
 public Person (String name, Status status) {
  this.name = name;
  this.status = status;
  friends = new FriendsList();
  wall = new Wall();
 }
 
 public String toString() {
  return name + " " + status + "\n" + friends.getNum() + " Friends:\n" + friends 
   + "Wall:\n" + wall;
 }
 
 public void addFriend(Person p) {
  friends.addFriend(p);
  p.friends.addFriend(this); //p.addFriend would create an infinite loop
 }
 
 public void removeFriend(Person p) {
  friends.removeFriend(p);
  p.friends.removeFriend(this);
 }

 public void addWallMessage(String msg, Person author) {
  if (friends.isFriend(author)) {
   wall.addPost(msg, author);
  }
  else {
   System.out.println("ERROR: " + author.getName() + " is not a friend of " + name);
  }
 }
 /**
  * Two persons are the same if they have the same name.
  * @param other
  * @return true if both have the same name.
  */
 public boolean equals(Person other) {
  return name.equalsIgnoreCase(other.name);
 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  Person mark = new Person("Mark Zuckerberg",Status.SINGLE);
  Person cam = new Person("Cameron Winklevoss",Status.ITS_COMPLICATED);
  Person tyler = new Person("Tyler Winklevoss",Status.MARRIED);
  Person tyler2 = new Person("tyler winklevoss",Status.UNKNOWN);
  Person peter = new Person("Peter Thiel",Status.UNKNOWN);

  System.out.println(mark);

  mark.addFriend(cam);
  mark.addFriend(tyler);
  mark.addFriend(tyler); //adding it for a SECOND time, so it does not get added
  mark.addFriend(tyler2); //tyler2 does not get added because he has the same name as tyler
  System.out.println(mark); //mark has 2 friends
  System.out.println(tyler); //tyler has 1 friend
  


  mark.addWallMessage("Hello there! We have a project for you!", tyler);
  mark.addWallMessage("Yeah, its a Harvard-only friendster", cam);
  tyler.addWallMessage("Cool, I'll work on it", mark);
  
  System.out.println(mark);
  System.out.println(tyler);
  
  mark.addWallMessage("Hey, how is our social website coming?", cam);
  cam.addWallMessage("Its going to take some time, I got finals", mark);

  peter.addFriend(mark);
  peter.addWallMessage("I made this cool website, want to fund me?", mark);
  mark.addWallMessage("Sure", peter);
  
  mark.addWallMessage("Wait a minute! We paid you to build that!", cam);
  cam.addWallMessage("Nah hah", mark);
  mark.addWallMessage("Yeah ha", cam);
  cam.addWallMessage("I'm unfriending you and your twin", mark);
  
  mark.removeFriend(cam);
  mark.removeFriend(tyler);
  System.out.println(mark); 
  System.out.println(tyler);
  System.out.println(cam);
  System.out.println(peter);
  
  mark.addWallMessage("I'm going to sue you in federal court!", cam);
  
  System.out.println(mark);
  
 }

}

package hw5;

public class FriendsList {
 
 private static final int MAX_FRIENDS = 1024;
 
 private Person[] friend; 
 
 private int numFriends;
 
 public int getNum() {
  return numFriends;
 }
 
 public FriendsList() {
  friend = new Person[MAX_FRIENDS];
  numFriends = 0;
 }
 
 /**
  * Find out if p is in here.
  * @param p
  * @return true if p is in this friendlist
  */
 public boolean isFriend(Person p) {
  for (int i=0; i < numFriends; i++) {
   if (friend[i].equals(p)) {
    return true;
   }
  }
  return false;
 }
 
 /**
  * Add p to list but only if it is not in here already.
  * @param p
  */
 public void addFriend(Person p) {
  if (!isFriend(p)) {
   friend[numFriends++] = p;
  }
 }
 
 public String toString() {
  String result = "";
  for (int i=0; i < numFriends; i++) {
   result += friend[i].getName() + "\n";
  }
  return result;
 }
 
 public void removeFriend(Person p) {
  int i;
  for (i=0; i < numFriends; i++) {
   if (friend[i].equals(p)) break;
  }
  if (i < numFriends) {//p is a friend, at index i
   //overwrite friend[i] with friend[i+1], and so on till the end of the list
   for (int j = i; j < numFriends - 1; j++) {
    friend[j] = friend[j+1];
   }
   numFriends--;
  }
 }
 

}

package hw5;

public class Post {
 public String message;
 public Person author;
 
 public Post(String message, Person author) {
  this.message = message;
  this.author = author;
 }
 
 public String getMessage() {
  return message;
 }
 
 public String getAuthorName() {
  return author.getName();
 }
}

package hw5;

public class Wall {
 
 private Post[] posting;
 
 private int numPosts;
 
 private static final int MAX_WALL_POSTS = 1024;
 
 public Wall() {
  posting = new Post[MAX_WALL_POSTS];
  numPosts = 0;
 }
 
 public void addPost(String msg, Person author) {
  Post post = new Post(msg, author);
  posting[numPosts++] = post;
 }
 
 public String toString() {
  String result = "";
  for (int i=numPosts-1; i >= 0; i--) {
   result += posting[i].getAuthorName() + " writes:\n" + posting[i].getMessage() + "\n";
  }
  return result + "\n";
 }
}



No comments: