なんとなく開発日記(仮) このページをアンテナに追加 RSSフィード Twitter

現在公開停止中→「KeyJump」Chrome拡張
これらの機能の使用によって発生した何らかのトラブルや損失・損害等につきましては、一切責任を問わないものとします。

2011-06-30

Twitter4jで片想い管理

7/1 id:crimsonwoodsさんの指摘を受けて修正

タイトルの通りです。
片想い管理しようとしてもなかなかどうもうまい方法が見つからなかったので、備忘録としての意味も込めて。

	private HashSet<String> follower = new HashSet<String>();
	private void getFollowers(Twitter tw) {
		try {
			IDs followers = tw.getFollowersIDs(tw.getId(), -1);
			long[] followerIDs = followers.getIDs();
			for (int i=0; i<followerIDs.length; i++) {
				follower.add(String.valueOf(followerIDs[i]));
			}
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (TwitterException te) {
			te.printStackTrace();
		}
	}

流れ:
1.followerという名前のHashSetを作るHashMapを作る(はっきり言って<String, String>の後の方のStringは使わない)
2.getFollowerIDsでフォロワーの一覧を取得。
3.getIDsでID(ScreenNameではなく、数字で構成されるID)を取得。
4.HashSetにIDを追加しまくる(さっき言った通り値の"true"は使わない)

こういうメソッド作って最初に呼び出して、つぶやきが飛んできたときに

	follower.contains(String.valueOf(status.getUser().getId()));

trueなら両想い、falseなら片想いという感じで判定可能です。

流れの1.を見て普通の配列でもいいじゃないか!と思った方、鋭いです。
でも普通の配列を使うと、片想いかどうか判定するときに、最悪、配列の要素数だけループする必要が出てきてしまいます。
これはとても効率が悪い(と思う)ので、どうしてもHashSetにIDを持ってきたく、このような実装になりました。

今思うとキーの方をString型にする必要はあったんでしょうか…
相変わらず僕のすることはよく分からないですねw ロクにテストもしてませんし…。

ツッコみ大歓迎ですので、「ここおかしいよ!」というところがあったらぜひ教えてください。

crimsonwoodscrimsonwoods 2011/07/01 00:53 Keyを使わないならHashMapじゃなくてHashSet使うべきですね。あとIDsがちゃんとHashMapに突っ込める型になっているならStringにするよりIDsのままの方が効率よいかも。あとfollowerIDsはinstance variableじゃなくて良いよね。

nash716nash716 2011/07/01 01:12 HashSetなんてものがあったんですね… そんなものは無いのだと勝手に頭の中で決めつけてました。
ですがHashMapにIDsを使うのはいろいろと都合が悪そうです…
followerIDsについては確かにそうですね… 修正しておきます
ツッコみありがとうございます! お恥ずかしい限りです

トラックバック - http://d.hatena.ne.jp/nash716/20110630/1309444643