Map - 具有多个值的单个键

时间:2015-02-27 00:54:08

标签: java dictionary hashmap

好吧,我有一个名为listaParcelasGerarOrcamento的列表,它包含以下项目:

05/03/2015 Parcela 2/5 32.00
12/03/2015 Parcela 3/5 32.00
19/03/2015 Parcela 4/5 32.00
26/02/2015 Parcela 1/5 32.00
26/02/2015 Parcela 1/9 12.00
26/03/2015 Parcela 5/5 32.00
28/03/2015 Parcela 2/9 12.00
28/04/2015 Parcela 3/9 12.00
28/05/2015 Parcela 4/9 12.00
....

我需要将它们放在HashMap中,我使用日期作为键并尝试将另一方放入列表中并传递为值,但是在02.26.2015那天它只添加了第二项,而不是两者。

    Map<String, List<ItensDespesaOrcamentoParcelas>> mapa = new HashMap<String, List<ItensDespesaOrcamentoParcelas>>();

    for (int i = 0; i < listaParcelasGerarOrcamento.size(); i++) {

        List<ItensDespesaOrcamentoParcelas> listaItens = new ArrayList<ItensDespesaOrcamentoParcelas>();

        ItensDespesaOrcamentoParcelas itensParcela = new ItensDespesaOrcamentoParcelas();

        itensParcela.setDataPagamento(listaParcelasGerarOrcamento.get(i)
                .getDataPagamento());
        itensParcela.setDescricaoParcela("Descricao "
                + listaParcelasGerarOrcamento.get(i).getDescricaoParcela());
        itensParcela.setValorParcela(listaParcelasGerarOrcamento.get(i)
                .getValorParcela());
        listaItens.add(itensParcela);

        mapa.put(listaParcelasGerarOrcamento.get(i).getDataPagamento(),
                listaItens);

    }

2 个答案:

答案 0 :(得分:2)

你想要的是一个多图。有几个图书馆提供它们,但我自己更喜欢Guava。

如果你想模拟它,那么这一行

mapa.put(listaParcelasGerarOrcamento.get(i).getDataPagamento(),
                listaItens);

需要改变这样的事情

String keya = listaParcelasGerarOrcamento.get(i).getDataPagamento();

List<ItensDespesaOrcamentoParcelas> lista = mapa.get(keya);
if (lista == null) {
  lista = new ArrayList<ItensDespesaOrcamentoParcelas>();
  mapa.put(keya, lista);
}
lista.addAll(listaItens);

答案 1 :(得分:1)

您的问题是,您要在ArrayList<ItensDespesaOrcamentoParcelas>循环的每个迭代中重新创建for,并将新列表重新插入地图。您需要在第一次看到特定密钥时创建列表,然后 将项目添加到列表中。

所以最终结果如下:

Map<String, List<ItensDespesaOrcamentoParcelas>> mapa = new HashMap<String, List<ItensDespesaOrcamentoParcelas>>();

for (int i = 0; i < listaParcelasGerarOrcamento.size(); i++) {
    String key = listaParcelasGerarOrcamento.get(i).getDataPagamento();

    ItensDespesaOrcamentoParcelas itensParcela = new ItensDespesaOrcamentoParcelas();
    itensParcela.setDataPagamento(key);
    itensParcela.setDescricaoParcela("Descricao " + listaParcelasGerarOrcamento.get(i).getDescricaoParcela());
    itensParcela.setValorParcela(listaParcelasGerarOrcamento.get(i).getValorParcela());

    if(mapa.get(key) == null)
        mapa.put(key, new ArrayList<>());

    mapa.get(key).add(itensParcela);
}