将多个项目添加到哈希图中

时间:2018-10-26 15:11:06

标签: java android

我正忙于一个程序,该程序需要使用数据库中的下拉列表来填充edit texts,我使用的是哈希图,但是我需要在哈希图中放置约10列,因为有10个字段需要填充。

这是我的代码:

        try {
            ConnectionHelper conStr = new ConnectionHelper();
            connect = conStr.connectionclass();

            if (connect == null) {
                Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show();
            } else {
                String query = "select * from Customers";
                stmt = connect.prepareStatement(query);
                rs = stmt.executeQuery();
                ArrayList<String> dataF = new ArrayList<>();
                hashmap = new HashMap<>();


                while (rs.next()) {
                    String id = rs.getString("CUSTOMER_ID");
                    String CName = rs.getString("CUSTOMER_FIRST_NAME");
                    String Surname = rs.getString("CUSTOMER_SURNAME");
                    String Number = rs.getString ("CUSTOMER_TEL_NUMBER");
                    String Cell= rs.getString ("CUSTOMER_CELL_NUMBER");
                    String Buiilding= rs.getString ("CUSTOMER_BUILDING_NUMBER");
                    String Street= rs.getString ("CUSTOMER_STREET");
                    String suburb= rs.getString ("CUSTOMER_SUBURB");
                    String City= rs.getString ("CUSTOMER_CITY");
                    String postal= rs.getString ("CUSTOMER_ZIP_CODE");
                    // value of database
                    dataF.add(id);
                    hashmap.put(id,CName,Surname,Number,Cell,Buiilding,Street,suburb,City,postal);

                }
                ArrayAdapter NoCoreAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, dataF);
                customerselect.setAdapter(NoCoreAdapter);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
   customerselect.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                                       int position, long id) {
                String name = customerselect.getSelectedItem().toString();
                String CName = hashmap.get(name);
                String Surname = peopleByForename.get(name);
                String Number = hashMap1.get(name);
                String Cell = hashMap2.get(name);
                String Building = hashMap2.get(name);
                String Street = hashMap3.get(name);
                String suburb = hashMap3.get(name);
                String City = hashMap4.get(name);
                String postal = hashMap4.get(name);

                rFname.setText(CName);
                        rLname.setText(Surname);
                rTelnum.setText(Number);
                        rCellnum.setText(Cell);
                rCusbuild.setText(Building);
                        rCusstr.setText(Street);
                rCussub.setText(suburb);
                        rCuscity.setText(City);
                rCuszip.setText(postal);


            }

我收到以下错误:

put() in HashMap cannot be applied to:
Expected Actual
Parameters Arguments
Key: String id
value: String CName 
Surname(java.lang.string)
Number(java.lang.string)
Cell(java.lang.string)
Building(java.lang.string)
Street(java.lang.string)
suburb(java.lang.string)
City(java.lang.string)
postal(java.lang.string)

我使用hashmap的原因是因为我遵循的示例使用了hashmaps,但我不知道如何使用列表在下拉列表中显示

6 个答案:

答案 0 :(得分:0)

如果您查看put界面的Map方法的源代码,您会发现您只能找到:

put(K key, V value)

这正是Map的工作方式。您将键映射到一个值,这样您就可以快速访问它,而无需遍历整个映射。因此,根据您的情况,我建议您将所有信息存储在Customer之类的复杂对象中,并将其映射到客户的相关ID。

如果您需要有效地查询客户数据(而不使用ID),请考虑使用可以为您完成工作的数据库。

答案 1 :(得分:0)

哈希图只能包含两列。 <键> <值> 您可以创建一个Customer类并将这些值添加到一个Customer对象。然后将该类放入Hashmap中。

Hashmap<String,Customer> map = new HashMap<>();
map.put(id, new Customer(id,surname,number...));

答案 2 :(得分:0)

HashMap仅采用两个参数:keyvalue

https://docs.oracle.com/javase/8/docs/api/index.html?java/util/HashMap.html


key应该是对象唯一的标识符。就您而言,您正在使用id。如果那是数据库表上的主键(或任何其他唯一编号),那是完全正确的。

其他字段需要包装到一个对象中(或单独存储在HashMap中,每个字段都有自己的唯一ID;根据您的问题,这并不是您正在做的事情)。

您应该这样做:

    final Customer customerObject = new Customer(CName, Surname, Number, Cell, Buiilding, Street, suburb, City, postal);
    hashmap.put(id, customerObject);

创建自定义Customer类及其所有字段仅供读者练习。

答案 3 :(得分:0)

放置方法具有Map<K, V>.put(K key, V value)签名。因此,您不能仅添加值。首先弄清楚应该使用什么键,然后使用put方法。您可以通过调用Map.get(Object key)方法来使用键来检索值。

答案 4 :(得分:0)

这只是一个例子,我希望您了解如何将这个例子与您的Scenerio一起使用。

public class Person{
String name,surName,number,....;

 public String getName(){
  return name;
 }

 public void  setame(String name){
  this.name=name;
 }

 //Create more getters setters like this
}



// create our map
Map<String, List<Person>> peopleByForename = new HashMap<>();    

// populate it
List<Person> people = new ArrayList<>();
people.add(new Person("Bob Smith"));
people.add(new Person("Bob Jones"));
peopleByForename.put("Bob", people);

// read from it
List<Person> bobs = peopleByForename["Bob"];
Person bob1 = bobs[0];
Person bob2 = bobs[1];

答案 5 :(得分:0)

我将创建包含所有字段的客户对象,而不是像hashmap.put(id, yourCustomerObject);那样添加该对象以进行映射