2

我正在从数据库中的表中检索数据并将整行添加到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

谁能指出问题出在哪里?

4

2 回答 2

6

我相信你必须重新分配listaValores.

简单地改变

 listaValores.clear();

 listaValores = new ArrayList<String>();
于 2013-05-22T16:03:45.157 回答
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);   
}
于 2013-05-22T16:19:42.147 回答