2012-03-22 2 views
1

Итак, я создал HashMap (ресурс - это мое собственное создание), каждый из которых является файловым путем для каждого ресурса. Теперь, допустим, у меня есть ресурс с файловым «mat \ 10wdim3.mat» в HashMap, попытка получить его не удастся, потому что оба хэш-кода не равны.String в равенстве HashMap

в хэш-код карты для этого ключа: -347056295 Строка Я использую, чтобы попытаться восстановить этот ресурс: -2128683668

Там нет скрытых символов я мог бы найти либо в строках. Есть ли другой способ, чтобы хэш-коды не совпадали?

EDIT:

В том числе некоторые примеры кода

Инициализация в конструкторе. Создание и добавление ресурсов (Путь к файлу отделан заранее)

private Map<String, Resource> m_Files; 

public ResourceManager() { 
    m_Files = new HashMap<String, Resource>(); 
} 

public Resource createResource(String filepath, byte[] contents) { 
    if (filepath != null && contents != null && contents.length > 0) {   
     String extension; 
     int lastIndex = filepath.lastIndexOf("."); 
     Resource res = null; 

     if (lastIndex == -1) 
      return null; 

     extension = filepath.substring(lastIndex).toLowerCase(); 

     // TODO: Optimize this by putting the most common at the top 
     try { 
      if (extension.equals(".pup")) 
       res = new Puppet(contents); 
      else if (extension.equals(".bm")) 
       res = new Bitmap(contents); 
      else if (extension.equals(".snd")) 
       res = new SoundFile(contents); 
      else if (extension.equals(".cmp")) 
       res = new ColorMap(contents); 
      else if (extension.equals(".mat")) 
       res = new Mat(contents); 
      else if (extension.equals(".sft")) 
       res = new Font(contents); 
      /*else if (extension.equals(".ai") // Normal AI 
        || extension.equals(".ai0") // Easy AI 
        || extension.equals(".ai2")) // Hard AI 
       res = new AIFile(contents);*/ 

      if (res != null) { 
       addResource(filepath, res); 

       return res; 
      } 
     } catch (RuntimeException e) { 
      e.printStackTrace(); 
     } 
    } 

    return null; 
} 

public void addResource(String filepath, Resource res) { 
    if (filepath != null && res != null && m_Files.put(filepath, res) != null) 
     System.out.println("[!] Replacing " + filepath); 
} 

public Resource getResource(String filepath) { 
    return m_Files.get(filepath); 
} 

Для того, чтобы получить сказал ресурсу

ResourceManager rManager = new ResourceManager(); 

rManager.loadGOB("C:/Documents and Settings/Unrealomega/Desktop/JKDF2/GOB/Resource/Res2.gob"); 

Resource res = rManager.getResource("mat\10wdim3.mat"); 
+0

Key = filepath, value = resource object? Что такое сделка с HashCodes? Можете ли вы предоставить примерный код? –

+0

Этого не должно быть, не совсем, нет. Фактический код? – Affe

+0

Было бы сложно дать вам ребята весь код сам, но я могу хотя бы отредактировать свой пост с тем, как я добавляю к HashMap. – Unrealomega

ответ

2

Проблема в том, что вы не избежали буквы '\' до '\\';

"mat \ 10wdim3.mat" .hashCode(); // - 2128683668

но если вы убегаете букву '\', вы получите последующей поток вывода:

"мат \\ 10wdim3.mat" .hashCode(); // -347056295

Итак, просто избегайте файловой строки String, когда вы извлекаете ресурс из HashMap!

+0

Отлично. Я не понял, что вам нужно бежать \\, только //. Благодаря! – Unrealomega

0

Если вы сравниваете строку «mat \ 10wdim3.mat» с объектом, который представляет файлpatpat h "mat \ 10wdim3.mat", тогда вы не получите совпадение, потому что String и объект могут иметь разные методы hashCode.

Если вы определенно с помощью строк или двух других объектов, которые имеют один и тот же метод Hashcode, то не должно быть никакого способа, которым они не равны

0

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

mystring.toCharArray() 
0

Вы абсолютно уверены, что ключ HashMap и струнный вы используете равны, то есть string1.equals(string2) == true? Если это так, они должны выдать один и тот же хэш-код.

0

Значение хеша строки зависит от длины строки. Следовательно, для получения значения мы должны иметь одну и ту же строку с той же длиной inorder. Нет необходимости реализовывать hashCode() и equals(), поскольку ключ, являющийся объектом класса String, уже реализовал эти два метода. Только вам нужно убедиться, что ключ - это тот же самый ключ, который вы использовали для добавления ресурса.