Java hashmap - пут не работает должным образом? - PullRequest
0 голосов
/ 17 января 2012

Я использую hashmap, но он работает неправильно. У меня есть класс Computing.java, где у меня есть метод для добавления в hashmap:

addIntoMap(String key, String value){

   m_parameters_values.put(key, value);
   }

и метод получения из hashmap:

public void getValueByKey(String key){
        System.out.println("GET "+m_parameters_values.get(key));
    }

Я вызываю эти методы из основного класса, но я не могу получить ключи, я все еще получаю нулевое значение. Ты знаешь почему?

Содержимое класса вычисления (конструкторы опущены):

public void Parse (String args[]) throws Exception{
        Parse(args,true);
    }

    public void Parse(String[] args, boolean throwErrorIfParamenterNotDefined) throws CmdLineException
    {


        int i = 0;

        while (i < args.length)
        {
            // The current string is a parameter name
            String key = args[i].substring(1, args[i].length() - 1).toLowerCase();
            String value = "";
            i++;
            if (i < args.length)
            {
                if (args[i].length() > 0 && args[i] == "-")
                {
                    // The next string is a new parameter, do not nothing
                } else
                {
                    // The next string is a value, read the value and move forward
                    value = args[i];
                    i++;
                }
            }

            if (!m_parameters.containsKey(key))
            {
                if (throwErrorIfParamenterNotDefined)
                {

                    //throw new CmdLineException("Parameter is not allowed.");

                }
                //continue;
            }
            System.out.println("Key: "+key+" value: "+value);
            m_parameters_values.put(key, value);
            //System.out.println("GET "+m_parameters_values.get("provider"));
            }

        // Check that required parameters are present in the command line. 

        for (String key : m_parameters.keySet())
        {
            if (m_parameters.get(key).required() && !m_parameters.get(key).exists())
                throw new CmdLineException("Required parameter is not found.");
        }


    }

    public void getValueByKey(String key){
        System.out.println("GET "+m_parameters_values.get(key));
    }

Содержание основного класса:

public static void main(String[] args) {

    Computing comp = new Computing("Computing");    

        cmdLine.Parse(args);
        cmdLine.getValueByKey("convert");

Ответы [ 3 ]

7 голосов
/ 17 января 2012

печать value используется в методе put.

Точность. на javadoc:

Возвращаемое значение null не обязательно указывает, что карта не содержит сопоставления для ключа; также возможно, что карта явно отображает ключ на ноль.

Чтобы быть уверенным, используйте метод containsKey, чтобы проверить, действительно ли существует key.

используйте следующий код в getValueByKey; и посмотрите, печатает ли он что-нибудь:

if (m_parameters.containsKey(key))
{
    System.out.println("GET "+m_parameters_values.get(key));
}
2 голосов
/ 17 января 2012

Я подозреваю, что вы не пытались отладить это в отладчике, потому что многие из ваших строк подозрительны.


String key = args[i].substring(1, args[i].length() - 1).toLowerCase();

Это даст вам строчные буквы с первым или последним символом,Хотя вы, возможно, захотите отбросить первое, если предположите, что оно начинается с -, но не ясно, что вы отбрасываете последнее.


args[i] == "-"

Это никогда не будет правдой, поскольку они не будутбыть тем же объектом.Возможно, "-".equals(args[i]) - это то, что вы намеревались.


for (String key : m_parameters.keySet())
{
    if (m_parameters.get(key).required() && !m_parameters.get(key).exists())

можно упростить как

for (ParameterValue pv : m_parameters.values()) {
    if (pv.required() && !pv.exists())

Интересно, может ли exists() иметь какое-либо отношение к тому,был установлен или нет в m_parameters_values

1 голос
/ 17 января 2012

Невозможно сказать, не увидев больше кода, но если бы мне пришлось угадывать, я бы предположил, что у вас есть более одного экземпляра класса Computing, и вы добавляете ключи к одному экземпляру, пытаясь извлечьих из другого экземпляра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...