Hy!我正在使用JDBC MySql Java项目,并试图将服务器数据库中的int值(Id Category)和String值(Name of meat)保存在简单的Java哈希图中。但每次我尝试在哈希图中调试代码时,都只保存特定类别膳食的最后一条记录中的值。例如,在我的桌子"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") );
}
您需要Map<Integer,Collection<String>>>
映射为每个键存储一个单个值,而当前您只存储一个字符串(从数据库中读取的最后一个字符串)。您需要存储一个字符串集合(例如,一个列表),并执行以下操作:
if (map.get(id) == null) {
map.put(id, new ArrayList<String>());
}
map.get(id).add(name);
因此,您首先检查特定密钥的初始化集合,如果不存在,则创建一个然后根据需要填充集合。
你会发现各种开源解决方案,让你的生活更轻松,例如谷歌的MultiMap
在您的示例中,您正在尝试执行以下操作。
让我们只考虑类别1的结果。
1、金枪鱼头1、腌凤尾鱼1、生寿司1、黑色意大利调味饭
之前循环金枪鱼肉馅饼是空的。
在迭代并放入哈希图时
PopisJela.put(1,"金枪鱼头");//第一次迭代
PopisJela.put(1,"腌凤尾鱼");//第二次迭代用"腌凤尾鱼"代替"金枪鱼酱"
PopisJela.put(1,"生寿司");//第三次迭代用"生寿司"取代"腌凤尾鱼"的价值
PopisJela.put(1,"黑色意大利调味饭");//第四次也是最后一次迭代,用"黑意大利饭"取代"生寿司"的价值
所以,在标签图PopisJela中,你总是只有最后一个值。
因此,在您的案例中,请按照以下方式创建hashmap。
映射>>PopisJela=新的HashMap>();
结果集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"));
}
}