Найти все ключи в HashMap с символом и заменить его - PullRequest
2 голосов
/ 04 октября 2010

У меня есть HashMap, и теперь мне нужно найти все ключи внутри HashMap, в котором есть определенная буква , и заменить ее другой буквой

Ответы [ 5 ]

3 голосов
/ 04 октября 2010

Вы можете попробовать это:

public void replaceKeysChar(char originalChar, char newChar, Map<String, ?> map) {
    Map<String, Object> tempMap = new HashMap<String, Object>();
    for (Map.Entry<String, ?> entry : map.entrySet()) {
        String key = entry.getKey();
        if(key != null){
            key = key.replace(originalChar, newChar);
        }
        tempMap.put(key, entry.getValue());
    }
    map.clear();
    map.putAll(tempMap);
}

Таким образом, вы обрабатываете только char и не меняете реализацию. Кроме того, когда вы выполняете итерацию, вы не добавляете элемент на карту (это было бы плохой идеей).

Если вы не заботитесь о реализации, просто верните tempMap и удалите часть clear / putAll (она потребляет меньше ресурсов).

РЕДАКТИРОВАТЬ:

После ответа @ locka Думаю, мне следует указать, что этот метод не может обрабатывать коллизии.

Если ваша Карта содержит ключи "toto" и "tata", и вы выполняете `replaceKeysChar ('a', 'o', map) только одно из значений между значением" toto "и" tata "' Значение s будет на карте, другое просто будет игнорироваться.

РЕДАКТИРОВАТЬ бис:

Для обработки коллизий с исключениями (как @Stephen C) просто замените старый for на этот:

    for (Map.Entry<String, ?> entry : map.entrySet()) {
        String key = entry.getKey();
        if(key != null){
            key = key.replace(originalChar, newChar);
        }
        if(tempMap.containsKey(key))
            throw new CollisionException();
        tempMap.put(key, entry.getValue());
    }
2 голосов
/ 04 октября 2010

Вот решение, которое "обрабатывает" столкновения, создавая исключение.

public void replaceKeysChar(char originalChar, char newChar, Map<String, ?> map) {
    Map<String, Object> tempMap = new HashMap<String, Object>();
    Set<String> tempSet = new HashSet<String>();
    for (Map.Entry<String, ?> entry : map.entrySet()) {
        String originalKey = entry.getKey();
        String newKey = originalKey .replace(originalChar, newChar);
        if (!newKey.equals(originalKey)) {
            if (map.containsKey(newKey) || tempMap.containsKey(newKey)) {
                throw new CollisionException(newKey);
            }
            tempMap.put(newKey, entry.getValue());
            tempSet.add(originalKey());
        }
    }
    map.keySet().removeAll(tempSet);
    map.putAll(tempMap);
}

РЕДАКТИРОВАТЬ

Исправлены ошибки ... в предыдущих версиях.

2 голосов
/ 04 октября 2010
  1. Создайте новую хэш-карту
  2. Скопируйте все пары (ключ, значение) из старой хеш-карты, за исключением того, что вы заменили OLDCHAR на NEWCHAR в ключах
  3. Поменяйте местами хеш-карты.
1 голос
/ 04 октября 2010

Я думаю, что люди обеспокоены тем, что вы не можете изменить ключ String на месте из-за неизменности, и хеш-код String связывается со значением строки.Добавление / удаление ключей может потенциально работать, но тогда вы рискуете столкнуться, когда вы в конечном итоге замените существующую строку случайным образом.

Наиболее очевидный способ решить эту проблему - использовать собственный ключ, например1003 *

public class MyKey {
  static private Random r = new Random();

  private String keyValue; 
  private final int hashCode = r.nextInt();

  @Override
  public int hashCode() {
    return hashCode;
  }

  public void setKeyValue(String keyValue) {
    this.keyValue = keyValue;
  }

  public String getKeyValue() {
    return keyValue;
  }
}

Этот ключ имеет строковое значение ключа, которое вы можете легко установить / получить, и hashCode, который является просто случайным числом.После добавления этого ключа в хэш-карту вы можете изменить строку на месте, не добавляя и не удаляя ключ.Все, что вам нужно сделать, это выполнить итерацию набора ключей и выполнить любую обработку ключа, которая вам нравится, без ущерба для хэш-кода, риска коллизий или чего-либо еще.

1 голос
/ 04 октября 2010

Итак, вы хотите изменить ключ. Если Hashalgorithm не является чем-то странным, вам придется получить все пары ключ-значение, удалить их из хэш-карты, изменить их и заново вставить их. Или вставьте их в новый Hashmap.

...