Explore Twitter’s Social Network
Twitter’s social network is a directed graph structure, where each user follows some other users. Here we consider two tasks:
- Random walk: Starting from one user, find a random friend, and continue …
- Common friends: Find common friends of two users
First we design two basic classes:
- TwitterUser: A data-type class representing the information of a Twitter user (id, name, friends)
- TwitterTool: A code-library class with methods on retrieving information from Twitter’s service
public class TwitterUser
{
long id;
String screen_name;
String name;
long friends_count;
long[] friends_ids;
public TwitterUser(long _id, String _screen_name, String _name, long _friends_count)
{
id = _id; screen_name = _screen_name; name = _name;
friends_count = _friends_count;
}
public long getId()
{
return id;
}
public String getName()
{
return name;
}
public void setFriendsIds(long[] fids)
{
friends_ids = fids;
}
public long[] getFriendsIds()
{
return friends_ids;
}
public String toString()
{
return id + ", " + name + ", " + screen_name;
}
}
import java.io.IOException;
import java.net.URL;
import java.util.Scanner;
public class TwitterTool
{
// Read from URL and return the content in a String
public static String readURLContent(String urlString) throws IOException
{
URL url = new URL(urlString);
Scanner scan = new Scanner(url.openStream());
String content = new String();
while (scan.hasNext())
content += scan.nextLine();
scan.close();
return content;
}
// Extract the middle part of a string from "open" to "close"
public static String extractMiddle(String str, String open, String close)
{
int begin = str.indexOf(open) + open.length();
int end = str.indexOf(close, begin);
return str.substring(begin, end);
}
public static TwitterUser constructTwitterUserByName(String screen_name) throws IOException
{
String para = "screen_name=" + screen_name;
return constructTwitterUser(para);
}
public static TwitterUser constructTwitterUserById(long id) throws IOException
{
String para = "user_id=" + id;
return constructTwitterUser(para);
}
public static TwitterUser constructTwitterUser(String para) throws IOException
{
String url = "http://api.twitter.com/1/users/show.json?" + para;
String content = readURLContent(url);
if (content == null)
return null;
long id = Integer.parseInt(extractMiddle(content, "\"id\":", ","));
String screen_name = extractMiddle(content, "\"screen_name\":", ",");
String name = extractMiddle(content, "\"screen_name\":", ",");
long friends_count = Integer.parseInt(extractMiddle(content, "\"friends_count\":", ","));
// Construct a TwitterUser object
TwitterUser u = new TwitterUser(id, screen_name, name, friends_count);
return u;
}
public static long[] retrieveFriendsIds(long id) throws IOException
{
// access Twitter to get friends
String url = "http://api.twitter.com/1/friends/ids.json?user_id=" + id;
String content = readURLContent(url);
if (content == null)
return null;
// extract ids
String str_ids = extractMiddle(content, "\"ids\":[", "]");
String[] str_ids_arr = str_ids.split(",");
long[] ids = new long[str_ids_arr.length];
for (int i = 0; i < ids.length; i++)
ids[i] = Long.parseLong(str_ids_arr[i]);
return ids;
}
}
Random Walk
We next define TwitterRandomWalk class. The input is a twitter user name.
- Find the user information
- Find friends of this user (a list of ids)
- Pick up a random friend id
- Find the user information, and friends
- ……
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;
public class TwitterRandomWalk
{
public static void main(String[] args) throws IOException
{
Scanner scan = new Scanner(System.in);
System.out.println("Please type in a twitter name:");
String screen_name = scan.nextLine();
TwitterUser u = TwitterTool.constructTwitterUserByName(screen_name);
System.out.println(u);
System.out.println("---------------------------------");
for (int i = 0; i < 20; i++)
{
// Get friends list
long[] friends = TwitterTool.retrieveFriendsIds(u.getId());
int r = (int) (friends.length * Math.random());
TwitterUser f = TwitterTool.constructTwitterUserById(friends[r]);
System.out.println("-->");
System.out.println(f);
}
}
}
Here we define the TwitterCommonFriend class. The inputs are two twitter usernames.
- Find friends of both users
- Check if one is a friend of the other
- Find common friends of the two users (the intersection of two sets of user-ids)
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;
public class TwitterCommonFriend
{
// find the intersection of two sorted arrays
public static long[] intersect(long[] a, long[] b)
{
long[] res = new long[a.length];
int i = 0, j = 0, k = 0;
while (i < a.length && j < b.length)
{
if(a[i] < b[j])
i++;
else if (a[i] > b[j])
j++;
else
{
res[k++] = a[i];
i++; j++;
}
}
return Arrays.copyOf(res, k);
}
public static void main(String[] args) throws IOException
{
Scanner scan = new Scanner(System.in);
System.out.println("Please type in two twitter names:");
String name1 = scan.nextLine();
String name2 = scan.nextLine();
TwitterUser user1 = TwitterTool.constructTwitterUserByName(name1);
TwitterUser user2 = TwitterTool.constructTwitterUserByName(name2);
System.out.println("---------------------------------");
System.out.println("The two users are:");
System.out.println(user1);
System.out.println(user2);
System.out.println("---------------------------------");
// Get friends list
long[] friends1 = TwitterTool.retrieveFriendsIds(user1.getId());
long[] friends2 = TwitterTool.retrieveFriendsIds(user2.getId());
Arrays.sort(friends1);
Arrays.sort(friends2);
if (Arrays.binarySearch(friends1, user2.getId()) >= 0)
System.out.println(user2.getName() + " is a friend of " + user1.getName());
if (Arrays.binarySearch(friends2, user1.getId()) >= 0)
System.out.println(user1.getName() + " is a friend of " + user2.getName());
System.out.println("---------------------------------");
long common_fids[] = intersect(friends1, friends2);
for (int i = 0; i < common_fids.length; i++)
{
TwitterUser u = TwitterTool.constructTwitterUserById(common_fids[i]);
System.out.println(u);
}
}
}