HashMap键和值不是唯一的吗?

时间:2015-08-05 09:27:27

标签: java hashmap

我的代码中有一个包含唯一值的HashMap。 当我向此集合添加新值时,容器会将所有值更改为新值。

我想知道这个集合是否保留了唯一值,我的代码中存在什么问题。因为我在另一个类中使用相同的集合但我没有这个问题。

//HashMaps filled with datas from JDialog 
HashMap<Integer,Activity> activity_hashmap = new HashMap<>();
HashMap<Integer,String> ad_activity_table_hashmap = new HashMap<>(); 

以下是将数据添加到HashMap的方法:

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    System.out.println("ADD");
    int activity_amount = Integer.parseUnsignedInt(jTextField17.getText());
    int activity_contract_number = Integer.parseUnsignedInt(jTextField19.getText());
    int activity_document_number = Integer.parseUnsignedInt(jTextField13.getText());
    String activity_st = jComboBox2.getSelectedItem().toString();
    int activity_number = -1;
    for (HashMap.Entry<Integer ,String> entry : ad_activity_table_hashmap.entrySet()){
        if (entry.getValue() == jComboBox2.getSelectedItem()){
            activity_number = entry.getKey();
        }
    }
    if (jTextField17.getText().equals("") || jTextField19.getText().equals("")){
        JOptionPane.showConfirmDialog(null, "لطفا همه فيلد ها را پر كنيد", "Message", JOptionPane.PLAIN_MESSAGE);
    }
    else if (!FinancialDocumentsJFrame.checkDocumentAmountText(jTextField17.getText())){
        JOptionPane.showConfirmDialog(null, "ورودي مبلغ فعاليت نامعتبر است لطفا دوباره بررسي كنيد", "Message", JOptionPane.PLAIN_MESSAGE);
    }
    else if (!FinancialDocumentsJFrame.checkNumberText(jTextField19.getText())){
        JOptionPane.showConfirmDialog(null, "ورودي شماره قرارداد نامعتبر است لطفا دوباره بررسي كنيد", "Message", JOptionPane.PLAIN_MESSAGE);
    }
    else if (jComboBox2.getSelectedIndex()==-1){
        JOptionPane.showConfirmDialog(null, "شرح فعاليت انتخاب نشده است لطفا دوباره بررسي كنيد", "Message", JOptionPane.PLAIN_MESSAGE);
    } 
    else if (!activity_hashmap.isEmpty()){  
        if (activity_number == -1){
            System.out.println("Error in Activity Number");
            JOptionPane.showConfirmDialog(null, "اشكال در شماره فعاليت لطفا دوباره تلاش كنيد", "Message", JOptionPane.PLAIN_MESSAGE);
        }
        else {
           boolean exists = activity_hashmap.containsKey(activity_number); 
           if (exists){
               JOptionPane.showConfirmDialog(null, "ورودي موجود است لطفا دوباره بررسي كنيد", "Message", JOptionPane.PLAIN_MESSAGE);
           } 
           else if ((count_activities_amount + activity_amount)>Integer.parseUnsignedInt(jTextField16.getText())){
               JOptionPane.showConfirmDialog(null, "جمع مبالغ با مبلغ سند نمي خواند لطفا دوباره بررسي كنيد", "Message", JOptionPane.PLAIN_MESSAGE);
           }
           else {
               jButton4ActionPerformed_count++;
               Activity act = new Activity(activity_st, activity_number, activity_amount, activity_contract_number, activity_document_number);
               System.out.println("Initialize");
               act.printactivitytInformation();
               activity_hashmap.put(activity_number, act);
               System.out.println("Add to hashmap");
               activity_hashmap.get(activity_number).printactivitytInformation();
               count_activities_amount += activity_amount;
               Object[] row = { activity_contract_number, Integer.parseUnsignedInt(jTextField16.getText())-count_activities_amount,  activity_amount, activity_st, activity_document_number };
               DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
               model.addRow(row);
               row_count++;
           }
        }

    }
    else {
        jButton4ActionPerformed_count++;
        jButton2.setEnabled(true);
        jButton3.setEnabled(true);
        jTextField19.setEnabled(false);
        //System.out.println("Error Activity");

        //System.out.println("Error Before Activity");

        Activity act = new Activity(activity_st, activity_number, activity_amount, activity_contract_number, activity_document_number);
        System.out.println("Initialize");
        act.printactivitytInformation();

        //System.out.println("Error Before Activity Adding");

        activity_hashmap.put(activity_number, act);
        System.out.println("Add to hashmap");
        activity_hashmap.get(activity_number).printactivitytInformation();
        //System.out.println("Error After Activity Adding");

        count_activities_amount += activity_amount;
        Object[] row = { activity_contract_number, Integer.parseUnsignedInt(jTextField16.getText())-count_activities_amount,  activity_amount, activity_st, activity_document_number };
        DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
        model.addRow(row);
        row_count++;

        }
    jTextField18.setText(count_activities_amount.toString());
    if (count_activities_amount == Integer.parseUnsignedInt(jTextField16.getText())){
        jButton4.setEnabled(false);
    }
    for (HashMap.Entry<Integer ,Activity> entry : activity_hashmap.entrySet()){
            System.out.println("ENumber2: "+entry.getValue().getActivityNumber());
            System.out.println("EName2: "+entry.getValue().getActivityStatement());

    }


}  

以下是发生的情况:当我向 activity_hashmap.put(activity_number,act); 添加新活动时,它会将所有值更改为最后插入的值。

ADD
ENumber2: 10114
EName2: سايت سازي 

ADD
ENumber2: 10112
EName2: فروش نرم افزار بنيادي
ENumber2: 10112
EName2: فروش نرم افزار بنيادي 

ADD 
ENumber2: 10113
EName2: پشتيباني نرم افزار بنيادي
ENumber2: 10113
EName2: پشتيباني نرم افزار بنيادي
ENumber2: 10113
EName2: پشتيباني نرم افزار بنيادي

ADD 
ENumber2: 10118
EName2: تجهيزات كاربردي خاص***
ENumber2: 10118
EName2: تجهيزات كاربردي خاص***
ENumber2: 10118
EName2: تجهيزات كاربردي خاص***
ENumber2: 10118
EName2: تجهيزات كاربردي خاص*** 

注意:打印行是我自己的调试。

1 个答案:

答案 0 :(得分:2)

由于Activity类的成员是静态的(如注释中所述),Activity类的所有实例都将具有相同的属性值(因为静态成员由所有实例共享)类)。因此,您在地图的所有值中都会看到相同的值。

将Activity类的成员更改为非静态(即删除静态关键字),您的问题将得到解决。