有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在哈希映射中多次添加相同的数据值?

Hashi希望将值添加到表单中。现在有些值是单个的,有些值我不需要在数组列表的for循环中多次添加

代码:

  data = new HashMap<String, String>();

                data.put("save", "1");
                data.put("disc", "");
                data.put("term_condi", edt_payment_terms.getText().toString());
                data.put("memo", edt_item_memo.getText().toString());
                data.put("note", edt_note.getText().toString());
                data.put("due_date", mDueDate);
                data.put("pay_terms", edt_payment_terms.getText().toString());
                data.put("currency_id", sessionData.getString("currency_id",""));
                data.put("currency_value",sessionData.getString("currency_value",""));
                data.put("invoice_date", mInvoiceDate);
                data.put("discount", mDiscount.toString());
                data.put("shipping", mShipping.toString());
                data.put("total", mTotalamount.toString());

                for (String email : mEmailList) {
                    data.put("send_to[]", email.toString());
                }

                for(Item item : mItemArrayList) {

                    data.put("tax[]", item.getItemTax());
                    data.put("qty[]", item.getItemQuantity());
                    data.put("item_name[]", item.getItemName());
                    data.put("unit_price[]", item.getItemUnitPrice());
                    data.put("disc[]", item.getDescription());

                }

                data.put("send", "1");

当我运行for循环时,我只得到hashmap中它的最后一个索引。我无法在for循环中初始化哈希映射,所有其他单个值都将得到双精度。 我该怎么做?请帮忙。谢谢


共 (2) 个答案

  1. # 1 楼答案

    HashMap中,如果使用相同的键添加值,HashMap将用最后一个值替换现有键In the document of HashMap

    public V put(K key, V value)
    

    将指定值与此映射中的指定键相关联。如果映射之前包含键的映射,则替换旧值

    例:

     HashMap map = new HashMap<String, String>();
     map.put("123", "1");
     map.put("123", "2");
    

    在本例中,map大小为1(key=“123”,value=“2”)

    我认为您应该创建一个格式为“str1,str2,str3”的字符串,并将该字符串放入HashMap。以使用字符串接收值的形式。拆分(“,”)以获取每个值

  2. # 2 楼答案

    你可以: 1.使用列表作为值的地图。地图>;。 2.创建一个新的包装器类,并将该包装器的实例放在映射中。地图 3.使用类似元组的类(省去了创建大量包装器的麻烦)。地图>;。 4.并排使用多张地图。 例子

    1. 以列表作为值的映射

      //创建我们的地图 地图>;peopleByForename=new HashMap>;();

      //填充它 List people=new ArrayList(); 人添加(新人(“鲍勃·史密斯”); 人添加(新人(“鲍勃·琼斯”); 人们直呼其名。放(“鲍勃”,人们)

      //从中读出 列出Bob=peopleByForename[“Bob”]; 人员bob1=bobs[0]; 人bob2=BOB[1]

    这种方法的缺点是,列表不能精确绑定到两个值

    1. 使用包装器类

      //定义我们的包装器 类包装器{ 公共包装(个人1,个人2){ 这person1=person1; 这person2=person2; }

      public Person getPerson1 { return this.person1; }
      public Person getPerson2 { return this.person2; }
      
      private Person person1;
      private Person person2;
      

      }

      //创建我们的地图 Map peopleByForename=new HashMap()

      //填充它 包装人=新包装人() 人们直呼其名。放置(“鲍勃”,新包装物(新人(“鲍勃·史密斯”), 新人(“鲍勃·琼斯”)

      //从中读出 包装bobs=peopleByForename[“Bob”]; 人bob1=人BOB。人1; 人bob2=bobs。人2

    这种方法的缺点是,必须为所有这些非常简单的容器类编写大量的boiler plate代码

    1. 使用元组

    //您必须用Java编写或下载一个元组类,(.NET附带一个元组类)

    // create our map
    Map<string, Tuple2<Person, Person> peopleByForename = new HashMap<string, Tuple2<Person, Person>>();
    
    // populate it
    peopleByForename.put("Bob", new Tuple2(new Person("Bob Smith",
                                           new Person("Bob Jones"));
    
    // read from it
    Tuple<Person, Person> bobs = peopleByForename["Bob"];
    Person bob1 = bobs.Item1;
    Person bob2 = bobs.Item2;
    This is the best solution in my opinion.
    
    4. Multiple maps
    
    // create our maps
    Map<string, Person> firstPersonByForename = new HashMap<string, Person>();
    Map<string, Person> secondPersonByForename = new HashMap<string, Person>();
    
    // populate them
    firstPersonByForename.put("Bob", new Person("Bob Smith"));
    secondPersonByForename.put("Bob", new Person("Bob Jones"));
    
    // read from them
    Person bob1 = firstPersonByForename["Bob"];
    Person bob2 = secondPersonByForename["Bob"];
    

    这种解决方案的缺点是,这两个映射并不明显相关,编程错误可能会导致这两个映射不同步