Java hashmap 不允许调用 get 方法

标签 java hashmap nested

我有一个带有嵌套哈希的 Java 程序。当我在最内层的嵌套中调用一个值时,我得到一个错误,指出我不能为类型对象调用 get,但是当我调用 getClass().getName() 时,我得到了 HashMap。这是回溯的副本

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The method get(String) is undefined for the type Object

    at EpitopeAnalysis.parseColumns(EpitopeAnalysis.java:88)
    at EpitopeAnalysis.<init>(EpitopeAnalysis.java:43)
    at JobManager.<init>(JobManager.java:42)
    at Analyzer.main(Analyzer.java:13)

这是我的代码的副本

import java.awt.List;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;

import org.bson.types.BasicBSONList;

import com.google.gson.*;
import com.google.gson.reflect.TypeToken;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;


public class EpitopeAnalysis {
    int combinations;
    int[] positions;
    String locus;
    ArrayList<Subject> subjects;

    private static String[] ValidAcids = {
            "A","B","C","D","E","F","G","H","I","K","L","M",
            "N","P","Q","R","S","T","U","V","W","Y","Z"
    };

    @SuppressWarnings("unchecked")
    EpitopeAnalysis(BasicDBObject jobObject) {
        combinations = (int) jobObject.get("combinations");
        locus = (String) jobObject.get("locus");

        // Create subject ArrayList
        Gson gson = new Gson();
        Type subjectType = new TypeToken<ArrayList<Subject>>(){}.getType();
        subjects = gson.fromJson(jobObject.get("subjects").toString(), subjectType);

        // Create an array of positions
        BasicDBList _pos = (BasicDBList) jobObject.get("positions");
        positions = new int[_pos.size()];
        for (int i = 0; i < _pos.size(); i++) {
            positions[i] = (int)_pos.get(i);
        }

        parseColumns();
    }

    private void parseColumns() {
        ArrayList<String> affectedAlleles = new ArrayList<String>();
        ArrayList<String> controlledAlleles = new ArrayList<String>();

        // Segregate alleles by the dx of the subjects
        for(int i = 0; i < subjects.size(); i++) {
            if (subjects.get(i).dx.toUpperCase().equals("AFFECTED")) {
                affectedAlleles.add(subjects.get(i).alleles[0]);
                affectedAlleles.add(subjects.get(i).alleles[1]);
            }
            else if (subjects.get(i).dx.toUpperCase().equals("CONTROL")) {
                controlledAlleles.add(subjects.get(i).alleles[0]);
                controlledAlleles.add(subjects.get(i).alleles[1]);
            }
        }

        //System.out.println(affectedAlleles[4]);
        /* 
         * Generate schema for analysisHash
         *  {
         *      "AFFECTED": {
         *          1: {"A": 0, "B": 0, ...},
         *          2: {},
         *      }
         *      "CONTROL": { ... }
         *  }
         * */

        HashMap<String, HashMap> analysisHash = new HashMap<String, HashMap>();
        analysisHash.put("AFFECTED", new HashMap<Integer, HashMap>());
        analysisHash.put("CONTROL", new HashMap<Integer, HashMap>());
        for(int i = 0; i < positions.length; i++) {
            analysisHash.get("AFFECTED").put(
                        positions[i], 
                        generateAcidHash()
                    );
            analysisHash.get("CONTROL").put(
                        positions[i], 
                        generateAcidHash()
                    );
        }

        /*
         *  Iterate over positions
         *      Iterate over alleles
         *      append to analysisHash
         * */
            // returns java.util.HashMap
            System.out.println(
                analysisHash.get("AFFECTED").get(9).getClass().getName()
            );

            // I am given the error here
        System.out.println(analysisHash.get("AFFECTED").get(9).get("A"));

    private HashMap<String, Integer> generateAcidHash() {
        HashMap<String, Integer> acidHash = new HashMap<String, Integer>();

        for(String acid: ValidAcids) {
            acidHash.put(acid, 0);
        }

        return acidHash;
    }
}

最佳答案

你已经声明了

 HashMap<String, HashMap> analysisHash;

其中内部 HashMap 没有类型参数。所以它默认为 Object

您正在对 Object 类型的对象调用 get(String)

System.out.println(analysisHash.get("AFFECTED").get(9).get("A"));
                                                  |     |
                                                  |     |---------->is called on instance of type Object
                                                  | ---------------> returns an instance of type Object

Object 没有 get(String) 方法。

将声明更改为

HashMap<String, HashMap<Integer, HashMap<String, SomeType>>> analysisHash;

或您需要的任何其他内容。

关于Java hashmap 不允许调用 get 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18409227/

相关文章:

java - 获取音乐播放器Android的专辑封面(错误)

java - 当对象 Hashcode 更改时,Hashmap 或 Hashset 中的查找会发生什么

python - 通过迭代重命名Python嵌套字典中的键和子键

javascript - 如何使用嵌套属性和选定的组合框选项创建实时乘法?

java - java语言如何将字符串解析成hashmap

php - 使用准备好的语句在 mysqli 中嵌套 SELECT

java - android数据库未打开-SQLITE

java - 寻找可扩展的 "at"实现

java - HttpURLConnection.getResponseCode() 不返回 301 (在 java 中)

java - 多线程不同步访问Hashmap