つくってみたはいいけど、amachangさんとかHamachiya2さんとかdankogaiさんとか、上位にきそうな人が上位に来たので面白くなかった。
Rubyならこんなに短くかけるよ!とか、やればいいと思う。
import java.io.*; import java.net.*; import java.util.*; import javax.xml.bind.*; import javax.xml.bind.annotation.*; public class Recommender { /** キャッシュ置き場 */ static String path = "C:\\User\\kishida\\twitterfriends\\"; /** ユーザーデータを読み込み */ static Users getUsers(String name){ try { String filename = path + name + ".xml"; File f = new File(filename); if(!f.exists()){ // 読み込んでキャッシュする FileOutputStream fos = new FileOutputStream(f); URL url = new URL("http://twitter.com/statuses/friends/" + name + ".xml"); InputStream is = url.openStream(); int len; byte[] b = new byte[1000]; while((len = is.read(b)) >= 0){ fos.write(b, 0, len); } fos.close(); is.close(); } //XMLを読み込んで解析 JAXBContext con = JAXBContext.newInstance(Users.class); Users us = (Users) con.createUnmarshaller().unmarshal(f); return us; } catch (MalformedURLException ex) { } catch(JAXBException ex){ } catch(IOException ex){ } return null; } /** ここから始まる */ public static void main(String args[]){ String user = args[0]; //followを得る Map<String, Integer> m = new HashMap<String, Integer>(); Users us = getUsers(user); for(User u : us.userList){ //followしてる人がfollowしてる人を得る Users fus = getUsers(u.screenName); for(User fu : fus.userList){ int i = 1; if(m.containsKey(fu.screenName)){ i += m.get(fu.screenName); } m.put(fu.screenName, i); } } //自分がfollowしている人を削る for(User u : us.userList){ m.remove(u.screenName); } //自分を削る m.remove(user); //並べ替え Map.Entry[] mes = m.entrySet().toArray(new Map.Entry[0]); Arrays.sort(mes, new Comparator<Map.Entry<String, Integer>>(){ public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { if(o1.getValue() < o2.getValue()) return 1; if(o1.getValue() > o2.getValue()) return -1; return 0; } }); //表示 System.out.println("あなたがfollowしている人は、こんな人たちをfollowしています"); for(int i = 0; i < 5; ++i){ Map.Entry<String, Integer> me = mes[i]; System.out.printf("%s:%d%n", me.getKey(), m.get(me.getKey())); } } /** usersタグ格納用 */ @XmlRootElement(name="users") @XmlAccessorType(XmlAccessType.NONE) public static class Users{ @XmlElement(name="user") List<User> userList = new ArrayList<User>(); } /** userタグ格納用 */ @XmlAccessorType(XmlAccessType.NONE) public static class User{ @XmlElement(name="screen_name") String screenName; } }
追記:コメント書いておきました。