在一段时间内将ArrayList添加到TreeMap

时间:2013-05-22 16:00:54

标签: java arraylist treemap

我正在从数据库中的表中检索数据,并将整行添加到TreeMap

我正在使用以下代码:

ArrayList<String> listaValores = new ArrayList();
TreeMap<Integer, ArrayList> tmValores = new TreeMap<>();

(...)

    while (rs.next()) 
    {
        listaValores.clear();
        for(int i=2; i<=ncolunas; i++)
        {
            listaValores.add(rs.getString(i));
        }
        tmValores.put(rs.getInt(1), listaValores);   
    }

我的TreeMap键被很好地插入,但是这些值总是作为SELECT * FROM Table查询的结果重复为最后一行的值。

所以,如果我的表是:

id | name | last name | 
1  | joe  | lewis     | 
2  | mark | spencer   | 
3  | mike | carter    | 
4  | duke | melvin    |

我的TreeMap包含:

1=> duke, melvin  
2=> duke, melvin  
3=> duke, melvin  
4=> duke, melvin

而不是(我想要的)

1=> joe, lewis 
2=> mark, spencer 
3=> mike, carter 
4=> duke melvin

有人能指出我的问题在哪里吗?

2 个答案:

答案 0 :(得分:6)

我认为你必须重新分配listaValores的价值。

只需更改

 listaValores.clear();

 listaValores = new ArrayList<String>();

答案 1 :(得分:4)

Java中的对象作为引用传递,因此您实际上为地图中的所有键添加了相同的列表。

由于你在每一步都清除它,然后为它添加一些值,它将在while循环结束后仅包含最后一行。

您真正想要做的是为每一行创建ArrayList的实例并将其添加到地图中,而不是清除旧版本中的值:

while (rs.next()) 
{
   listaValores = new ArrayList<String>();

   for(int i = 2; i <= ncolunas; i++)
   {
       listaValores.add(rs.getString(i));
   }

   tmValores.put(rs.getInt(1), listaValores);   
}