地图 - 具有多个值的单键

Map - Single key with multiple values

嗯,我有一个名为 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);

    }

你要的是多图。有几个库提供了它们,但我自己更喜欢 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);

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

因此最终结果将如下所示:

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);
}