java program that uses HashMaps to store the data for social network
In social networking websites, people link to their friends to form a social network.
Write a java program that uses HashMaps to store the data for such a network. Your
program should read from a file that specifies the network connections for different
usernames. The file should have the following format to specify a link:
source_usernamefriend_username
There should be an entry for each link, one per line. Here is a sample file for five
usernames:
iba java_guru
iba crisha
iba ducky
crisha java_guru
crisha iba
ducky java_guru
ducky iba
java_guru iba
java_guru crisha
java_guru ducky
wittless java_guru
In this network, everyone links to java_guru as a friend. iba is friends with java_
guru, crisha, and ducky. Note that links are not bidirectional; wittless links
with java_guru but java_guru does not link with wittless.
First, create a User class that has an instance variable to store the user’s name
and another instance variable that is of type HashSet<User>. The HashSet<User>
variable should contain references to the User objects that the current user links
to. For example, for the user iba there would be three entries, for java_guru,
crisha, and ducky. Second, create a HashMap<String,User> instance variable
in your main class that is used to map from a username to the corresponding User
object. Your program should do the following:
• Upon startup, read the data file and populate the HashMap and HashSet data
structures according to the links specified in the file.
• Allow the user to enter a name.
• If the name exists in the map, then output all usernames that are one link away
from the user entered.
• If the name exists in the map, then output all usernames that are two links away
from the user entered. To accomplish this in a general way, you might consider
writing a recursive subroutine.
Do not forget that your User class must override the hashCode and equals methods.
Answer:
/**
* This program creates a hash map from a username to a User object.
* The User object contains a HashSet of friends (other users) for
* that user. We can use this list to compute a "neighborhood" of friends -
* in this case, everyone within two links from a target user.
*/
import java.util.HashMap;
import java.util.Scanner;
import java.util.StringTokenizer;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Question
{
public static void main(String[] args)
{
// The users HashMap maps from a username to a User object
HashMap<String,User> users = new HashMap<String,User>();
// First load the social network from the file to the map
try
{
Scanner inputStream =
new Scanner(new FileInputStream("network.txt")); // CHANGE
// Read in each line, which is a source user and friend user
while (inputStream.hasNextLine())
{
String line = inputStream.nextLine( );
StringTokenizer wordFactory = new StringTokenizer(line);
// Read in two tokens from line
String srcUserName = wordFactory.nextToken();
String friendUserName = wordFactory.nextToken();
// Add users to the map if not already there
if (!users.containsKey(srcUserName))
{
users.put(srcUserName, new User(srcUserName));
}
if (!users.containsKey(friendUserName))
{
users.put(friendUserName, new User(friendUserName));
}
// Retrieve user object and add friend
User srcUser = users.get(srcUserName);
User friendUser = users.get(friendUserName);
srcUser.addFriend(friendUser);
}
inputStream.close();
}
catch(FileNotFoundException e)
{
System.out.println("File was not found");
System.out.println("or could not be opened.");
}
catch(IOException e)
{
System.out.println("Error reading from file.");
}
// Output what we loaded
System.out.print("Users loaded: ");
for (User u : users.values())
{
System.out.print(u.getName() + " ");
// Uncomment this section to show all friends
// for each user
/*
for (Object f : u.getFriendsArray())
{
User friendObj = (User) f;
System.out.print(friendObj.getName() + " ");
}
System.out.println();
*/
}
System.out.println();
// Allow the user to input a name and then output the
// friends that are up to 2 links away
String name = "";
Scanner keyboard = new Scanner(System.in);
do
{
System.out.println("Enter a username and all friends");
System.out.println("two links or less will be displayed.");
System.out.println("Press enter to exit.");
name = keyboard.nextLine();
if (users.containsKey(name))
{
System.out.println("Friends for " + name);
User u = users.get(name);
u.showFriends(2); // Prints everyone up to 2 links away
}
else if (!name.equals(""))
{
System.out.println("Name not found.");
}
}
while (!name.equals(""));
}
}
/**
* User.java
*
* This class encapsulates user information.
* It holds a username and a set of User objects
* that this person links to as friends.
*/
import java.util.HashSet;
public class User
{
private String username; // User name
private HashSet<User> friends; // Set of friends
/* Constructors */
public User()
{
friends = new HashSet<User>();
}
public User(String newName)
{
username = newName;
friends = new HashSet<User>();
}
/* Accessors and Mutators */
public void setName(String newName)
{
username = newName;
}
public String getName()
{
return username;
}
public HashSet<User> getFriends()
{
return friends;
}
public Object[] getFriendsArray()
{
return friends.toArray();
}
/**
* addFriend adds a new friend object to the set of friends.
* @param newFriend User object to add to the set of friends
* as a direct friend.
*/
public void addFriend(User newFriend)
{
friends.add(newFriend);
}
/**
* removeFriend removes a friend object to the set of friends.
* @param oldFriend User object to remove from the set of direct friends
*/
public void removeFriend(Object oldFriend)
{
friends.remove((User) oldFriend);
}
/**
* showFriends is a wrapper method around the recursive routine
* that shows all friends up to maxNumLinks away.
* It adds a new variable to indicate the current number of links
* away from the source, and it initialized to 1.
*
* @param maxNumLinks Max number of links to show friends
*/
public void showFriends(int maxNumLinks)
{
showFriendsRecursive(1,maxNumLinks);
}
/**
* showFriendsRecursive does all the work in
* recursively showing all friends up to maxNumLinks away.
* It increments curNumLinks for each link traversed
* away from the source.
*
* @param curNumLinks Current number of links from source user
* @param maxNumLinks Max number of links to show friends
*/
private void showFriendsRecursive(int curNumLinks, int maxNumLinks)
{
// Show all direct friends to this user
for (User friend : friends)
{
System.out.println(username + " is friends with " + friend.getName() +
" (" + curNumLinks + " links)");
// Recurse on each friend if we haven't reached the
// maximum number of links
if (curNumLinks < maxNumLinks)
{
friend.showFriendsRecursive(curNumLinks + 1, maxNumLinks);
}
}
System.out.println();
}
}
Sample network file with nonsensical usernames.
The notation of the username indicates how many links away from user A or B.
The last digit indicates the number of links away from user A or B.
This can be used to test outputting friends to different distances.
network.txt
A A1_1
A A2_1
A A3_1
A1_1 A11_2
A1_1 A12_2
A2_1 A21_2
A11_2 A111_3
B B1_1
B B2_1
B B3_1
B1_1 B11_2
B1_1 B12_2
B2_1 B21_2
B11_2 B111_3
8.
File: ratings.txt
7
Harry Potter and the Half-Blood Prince
4
Harry Potter and the Half-Blood Prince
5
Army of the Dead
1
Harry Potter and the Half-Blood Prince
4
Army of the Dead
2
The Uninvited
4
Pandorium
3
Leave a reply