0

例: 1 つのクエリが次の結果セットをスローします。

名前 | 年齢 | 総計

  • ジョン・スミス、45歳、1000歳
  • ジョン・スミス、56歳、800歳
  • ジョン・スミザーズ、34歳、500歳
  • ジョン・スミス、56歳、500歳
  • ジョン・スミス、56歳、1100年

この配列リストを 3 つに分割し、キーがクライアント名であるハッシュマップに格納します。

みたいなことを考えていた

Arraylist<Row> rows = dao.getClientActivity();
Map map = new HashMap<Clients Name, Clients Row>();
Arraylist<Row>  = null;


for (Row row : rows){

    if (map.get(row.clientName) == null) list = new ArrayList<Row>();

    list.add(row);

    if(map.get(row.clientName) == null) map.put(row.clientName, list);

}

リストは常に名前順にソートされます。

上のスニペットを疑似コードとして取り上げます。家にコーディング プログラムはありません。頭のてっぺんからそれを手に入れました。今週の金曜日にそのようなものをテストしたと思いますが、行にしか印刷されませんでした。

これを行うためのより良い方法があるかどうかはわかりませんが、これが最初に思いついたものです。

4

2 に答える 2

3

マップの宣言は次のようにする必要があります (が であると仮定Row.clientName) String:

Map<String, List<Row>> map = new HashMap<String, List<Row>>();

for ループは次のようになります。

for (Row row : rows){
    /*Get the list of rows for current client name.*/
    List<Row> currRows = map.get(row.clientName); 
    if (currRows == null) {/*If not list exists for*/
        currRows = new ArrayList<Row>(); /*create a new one*/
        map.put(row.clientName, currRows); /*and put it in the map*/
    }
    currRows.add(row);/*add the current row to the list*/
}
于 2013-02-25T03:12:01.213 に答える
1

入力形式を変更する方法はないと思います。

クライアントを表すモデルを作成することをお勧めします。

public class Client {

    private final String name;
    private final byte age; //Nobody should be older than 256
    private final int total;

    /* Construct model */

    /* Getters/Functions */

}

また、内部にファクトリ メソッドClientを作成して、文字列入力からクラスを作成することをお勧めします。

public static Client parseClient(String clientRep){

    String[] clientData = clientRep.split(',');

    Client newClient = new Client(); //TODO: Name conventionally. 

    newClient.name = clientData[0];
    newClient.age = Byte.valueOf(clientData[1]);
    newClient.total = Integer.valueOf(clientData[2]);

    return newClient;

}

これで、これらをマップに追加できます ( Map<String, Client>)。

String clientFromWherever = getWhateverDataFromWherever();

Map<String, Client> clientel = new HashMap<>();

Client addingToMap = Client.parseClient(clientFromWherever);

clientel.put(addingToMap.getName() /* or however the name should be got */, addingToMap);

それは十分にうまくいくはずです。

=====

ただし、クライアント オブジェクトを使用したくない場合は、 を作成し、Map<String, int[]>その年齢と料金を配列に格納することをお勧めします。料金が を超えない場合Short.MAXVALUEは、 を使用してくださいshort[]。その少量のデータを格納するためだけに、多数の配列リスト (または複雑なコレクション) を格納する必要はありません。

ArrayList<Row> rows = dao.getClientActivity();
Map<String, int[]> clientelData = new HashMap<>();

for(Row clientRow : rows) {

    if (!map.containsKey(clientRow.clientName) {

        int[] clientNumericalData = new int[2];

        map.put(clientRow.clientName, clientNumericalData);

    }

}
于 2013-02-25T03:20:14.680 に答える