HY!我正在使用JDBC MySql Java项目,我正在尝试从简单的java哈希映射中的服务器数据库中保存int值(Id类别)和字符串值(用餐名称)。但每次我尝试在我的哈希映射中调试我的代码时,只保存来自特定类别餐的最后记录的值。为了exapmle,在我的表“naziv_jela”我有:(餐的名称,id_category),希腊沙拉1,金枪鱼酱1,腌制凤尾鱼1,生寿司1,黑烩饭2,番茄意大利面2,酿蘑菇2,意大利面杏仁2.每餐有自己的ID,他的名字和类别ID,我只想在哈希地图中保存类别ID和用餐名称,但它始终是特定类别的最后一个值,例如在上面的8条记录中,它只保存ID = 1的行寿司和每个类别ID = 2(最后值)的杏仁面食。我不知道为什么它只保存最后的值???我需要在哈希地图中使用所有类别的所有餐点。这是我的代码:
queryZaJela="SELECT id_kategorija, naziv_hrane FROM `naziv_jela`";
Map <Integer,String>PopisJela = new HashMap<Integer, String>();
Class.forName("com.mysql.jdbc.Driver");
Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://"
+ "localhost:3306/room_service", "root", "");
Statement Stat = (Statement) con.createStatement();
ResultSet Rez = Stat.executeQuery(queryZaJela);
while (Rez.next()) {
PopisJela.put(Rez.getInt("id_kategorija"), Rez.getString("naziv_hrane") );
}
答案 0 :(得分:1)
您需要Map<Integer,Collection<String>>>
Maps为每个键存储单个值,目前您只存储一个字符串(您从数据库中读取的最后一个字符串)。您需要存储一组字符串(例如,列表),并执行以下操作:
if (map.get(id) == null) {
map.put(id, new ArrayList<String>());
}
map.get(id).add(name);
因此,您首先检查特定密钥的初始化集合,如果不存在则创建一个。 然后根据需要填充集合。
您会找到各种开源解决方案,以使您的生活更轻松,例如Google的MultiMap
答案 1 :(得分:0)
在您的示例中,您尝试执行以下操作。
让我们只考虑第1类的结果。
1,金枪鱼头 1,腌制凤尾鱼 1,生寿司 1,黑烩饭之前循环tuna头脑PopisJela是空的。
迭代并放入hashmap
PopisJela.put(1,“tuna pate”); //第一次迭代
PopisJela.put(1,“腌制凤尾鱼”); //第二次迭代将“tuna pate”替换为“腌制凤尾鱼”
PopisJela.put(1,“生寿司”); //第三次迭代用“生寿司”取代“腌制凤尾鱼”值
PopisJela.put(1,“黑烩饭”); //第四次也是最后一次迭代将“raw sushi”替换为“black risotto”
所以,总是你只有hashmapJela中的最后一个值。
因此,在您的情况下,按以下方式创建hashmap。
地图&GT;&GT; PopisJela =新的HashMap&gt;();
...
ResultSet Rez = Stat.executeQuery(queryZaJela);
while (Rez.next()) {
if(PopisJela.get(Rez.getInt("id_kategorija") == null){
List<String> meals = new ArrayList<String>();
meals.add(Rez.getString("naziv_hrane"));
PopisJela.put(Rez.getInt("id_kategorija"), meals);
}else{
List<String> meals = (List<String>) PopisJela.get(Rez.getInt("id_kategorija"));
meals.add(Rez.getString("naziv_hrane"));
}
}
...