2009-06-29 17 views
5

私は繰り返し値を持つストリーミング入力を持っています。どのようなデータ構造でも使用できますが、各要素の発生回数を数えなければなりません。私は、次のような携帯電話メーカのリストがあるとします。リスト内の各アイテムの出現回数をカウントする

 
Apple 
Nokia 
Samsung 
Apple 
LG 
Nokia 
HTC 
Android 
Apple 
Nokia 
Nokia 
Apple 
Samsung 

私はこれが最適であるかどうかを確認していない

 
Apple,4 
Nokia,4 
Samsung,2 
LG,1 
Android,1 

などの詳細情報と、好ましくは、マップを任意のデータ構造を構築する必要があります。これ以上の解決策はありますか?
実際、私はまだコードとして上記を書いていません。より良いコードも役立ちます。

+0

「リスト項目を数える」そのフラットファイル – Tom

答えて

5

はい、私はMap<String, Integer>を使用します。私はこのようなものでaddをラップします:

private static void incrementValue(Map<String, Integer> counters, String toAdd) { 
    Integer currValue = counters.get(toAdd); 
    if (currValue == null) 
     counters.put(toAdd, 1); 
    else 
     counters.put(toAdd, currValue+1); 
} 

またはジェネリックなし:

private static void incrementValue(Map counters, String toAdd) { 
    Integer currValue = (Integer) counters.get(toAdd); 
    if (currValue == null) 
     counters.put(toAdd, 1); 
    else 
     counters.put(toAdd, currValue+1); 
} 
+0

から小さな情報ハズレ – Harish

+0

を使用する必要がありますよう...私はジェネリックを使用することはできません、それは作品冷却し、その – Harish

1

データはどこから来ていますか? dbの場合は、by groupでバックエンドのクエリでこれを非常に簡単に行うことができます。

+0

誤解を招くようで、私は、Java 1.4 – Harish

0

マップが進むべき道です。直接アクセス:)

キー:要素 値:リスト内の要素のインデックスを持つリスト。

0

投稿されたソリューションのほかに、私の頭に浮かぶ最初のことは、テーブル "コード値"を作成し、コードを使用してリストをエンコードすることです。それは非常にスペース効率が良いでしょう。

0

これの最も自然な構造は、別名「マルチセット」バッグです。

バッグは本質的にObject to Countの関数です。

Googleのコレクションにはマルチセットがありますが、HashMapを使用して独自のコレクションを簡単に作成できます。

http://google-collections.googlecode.com/svn/trunk/javadoc/index.html?com/google/common/collect/Multiset.html

+0

のthatsのためのおかげで素晴らしいが、カウントを得る方法? – Harish

+0

ただし、Google CollectionsにはJava 5が必要です。それ以外は、私の答えよりも簡単です。 –

+0

あなたはentrySet()を介してカウントすることができます。 カウントをストリーミングする場合は、カウントが変更されたときにリスナーに通知するように実装を拡張できます。 – pjp

4

ターゲットプラットフォームは、Java 1.4であったとして、それは、ジェネリックを使用することができなかった質問者によって言及されたので、一方はジェネリックを使用しないApache Commons Collectionsを使用することができます。

answer by pjpには、バッグが使用できると記載されています。

Apache Commons Collectionsには、getCountメソッドがあり、Bagに追加された特定のオブジェクトの数が返されるBagがあります。

以下がaddの一部IntegerオブジェクトHashBagに、及びカウントBagに含まれる各Integerオブジェクトの何ということの例である:

Bag b = new HashBag(); 

b.add(Integer.valueOf(1)); 
b.add(Integer.valueOf(2)); 
b.add(Integer.valueOf(2)); 
b.add(Integer.valueOf(3)); 

System.out.println("Count for 1: " + b.getCount(Integer.valueOf(1))); 
System.out.println("Count for 2: " + b.getCount(Integer.valueOf(2))); 
System.out.println("Count for 3: " + b.getCount(Integer.valueOf(3))); 

結果であった:

 
Count for 1: 1 
Count for 2: 2 
Count for 3: 1 

(私は、このコードが実際にコンパイルされ、Java 6で実行されるという免責事項を追加する必要がありますが、私は以前のJava 5日間の機能しか使用していないと考えています)

+0

thats brilliant ...私はあなたのために投票したいと思いますが、私はまだ評判を得る...応答のためにありがとう – Harish

+1

+1、これは受け入れられた答えでなければなりません。これをしない唯一の理由は、私が持っている外部図書館の恐怖です。 –