0

私はこの2次元配列を持っています

**Client| Status** 

    FAI | deferred
    SDE | Bounced
    FAI | Bounced
    SDE | Bounced
    SDE | deferred
    FAI | deferred

私がやりたいことは、ある種の統計出力を作成する関数を作成することです:例:

FAI --> Deferred 66 % , Bounced 34 %
SDE --> Deferred 34 % , Bounced 66%

注: 最初の列には多くの可能なクライアントがありますが、2 番目の列にはこれら 2 つの状態しかありません。

私が作成したい関数は、最初の列要素の発生をカウントする関数です。次に、クライアントごとに、バウンスまたは参照されている場合は各発生の状態を確認し、クライアントの統計を作成します。

ここで私は自分の機能を開始する方法を実際には知りません。ありがとうございました!

4

2 に答える 2

0

問題を効率的に解決するには、HashMap(またはMapインターフェースの他の実装)を使用します(@kaiソリューションは問題ありませんが、O(N ^ 2)です)。この例は一般的なものではありません。グリッド (データ マトリックス) の 2 番目の列に 2 つの可能な値 (deffered と bounced) がある場合にのみ機能します。解決策は次のように機能します。データ マトリックスの行を反復処理し、現在のエンティティ (名前で表す - グリッドの最初の列) が既にハッシュマップにあるかどうかを確認します。そうである場合は、そのエンティティのパーセント (Entity クラスの inc メソッド) をインクリメントするだけです。印刷も同様に行われます (マトリックスに表示される順序で名前を印刷する必要があるため): データを繰り返し処理し、エンティティ オブジェクトを印刷します (これが toString メソッドがオーバーライドされる理由です)。

import java.util.HashMap;

public class HelloWorld{
 static class Entity {
    private String name;
    private int countFirst;
    private int countSecond;
    private boolean isVisitedMember; // because we want to print in same order as in original matrix

    public Entity(String name) {
        this.name = name;
        countFirst = 0;
        countSecond = 0;
        isVisitedMember = false;
    }

    public void inc(String status) {
        if (status.toLowerCase().equals("deferred")) {
            ++countFirst;
        }
        else {
            ++countSecond;   
        }
    }

    public boolean isVisited() {
        return isVisitedMember;
    }

    public void setIsVisited(boolean value) {
        isVisitedMember = value;
    }

    public float getFirstPercent() {
        return (float)countFirst / (countFirst + countSecond) * 100;
    }

    public float getSecondPercent() {
        return (float)countSecond / (countFirst + countSecond) * 100;
    }

    @Override
    public String toString() {
        if (countFirst <= countSecond) {
            int first = (int)Math.ceil(getFirstPercent());
            return String.format("%s --> Deferred %d %% , Bounced %d %%", name, first, 100 - first);
        }

        int second = (int)Math.ceil(getSecondPercent());
        return String.format("%s --> Deferred %d %% , Bounced %d %%", name, 100 - second, second);
    }
 }


 public static void main(String []args){
    String[][] data = {
        { "FAI", "deferred" },
        { "SDE", "Bounced" },
        { "FAI", "Bounced" },
        { "SDE", "Bounced" },
        { "SDE", "deferred" },
        { "FAI", "deferred" },
    };

    HashMap<String, Entity> map = new HashMap<String, Entity>();
    for (int i = 0; i < data.length; ++i) {
        String name = data[i][0];
        String value = data[i][1];
        Entity entity = map.get(name);
        if (entity == null) {
            entity = new HelloWorld.Entity(name);
            map.put(name, entity);
        }

        entity.inc(value);
    }

    // print in same order as in original matrix
    for (int i = 0; i < data.length; ++i) {
        String name = data[i][0];
        Entity entity = map.get(name);
        if (entity.isVisited()) {
            continue;
        }

        entity.setIsVisited(true);
        System.out.println(entity);
    }        
 }

}

于 2013-10-09T11:11:06.667 に答える