あなたがfollowしている人はこんな人をfollowしています

つくってみたはいいけど、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;
    }    
}


追記:コメント書いておきました。