Нечувствительный к регистру hashmap для строк в Java - PullRequest
0 голосов
/ 13 ноября 2018

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

public class CaseInsensitiveMap extends HashMap<String, Integer> {

    @Override
    public Integer put(String key, Integer value) {
       return super.put(key.toLowerCase(), value);
    }

    // not @Override because that would require the key parameter to be of type Object
    public Integer get(String key) {
       return super.get(key.toLowerCase());
    }
}

и используется так же;

HashMap<String, Integer> stuff = new CaseInsensitiveMap();
stuff.put("happy", 11);
System.out.println(stuff);
Integer result = stuff.get("HAPPy");
System.out.println(result);
System.out.println(stuff);

но результат есть;

{happy=11}
null
{happy=11}

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Простое исправление;

CaseInsensitiveMap stuff = new CaseInsensitiveMap();

вывод на печать;

{happy=11}
11
{happy=11}

CaseInsensitiveMap расширяется HashMap<String, Integer>, так что это его подкласс, тот факт, что вы ссылаетесь stuff as HashMap (как суперкласс) позволяет ему использовать метод get по умолчанию.Вы даже можете видеть в IDE, что ваш пользовательский get(String) в CaseInsensitiveMap даже не используется.

Будут использоваться только переопределенные методы, если вы используете ссылку на суперкласс для подкласса, как вы сделали в своем коде.Вот почему работает только ваш пользовательский метод put(String, Integer), поскольку он переопределяет метод в super.

Ссылка на объекты подкласса с помощью ссылки Подкласс против суперкласса для получения дополнительной информации по этой проблеме.

0 голосов
/ 13 ноября 2018

Поскольку строка помечена как окончательная, возможно, она рассматривает расширения CharSequence

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class CaseInsensitiveMap<K extends CharSequence, V> implements Map<K, V> {

    private Map<K, V> map = new HashMap<K, V>();

    @Override
    public int size() {
        return map.size();
    }

    @Override
    public boolean isEmpty() {
        return map.isEmpty();
    }

    @Override
    public boolean containsKey(Object key) {
        return map.containsKey(key.toString().toLowerCase());
    }

    @Override
    public boolean containsValue(Object value) {
        return map.containsValue(value);
    }

    @Override
    public V get(Object key) {
        return map.get(key.toString().toLowerCase());
    }

    @Override
    public V put(K key, V value) {
        return map.put((K) key.toString().toLowerCase(), value);
    }

    @Override
    public V remove(Object key) {
        return map.remove(key.toString().toLowerCase());
    }

    @Override
    public void putAll(Map<? extends K, ? extends V> m) {
        map.putAll(m);      
    }

    @Override
    public void clear() {
        map.clear();
    }

    @Override
    public Set<K> keySet() {
        return map.keySet();
    }

    @Override
    public Collection<V> values() {
        return map.values();
    }

    @Override
    public Set<java.util.Map.Entry<K, V> > entrySet() {
        return map.entrySet();
    }

    @Override
    public String toString() {
        return map.toString();
    }

}

Класс тестирования необходимо изменить следующим образом:

import java.util.*;
import java.io.File;
import java.io.FileNotFoundException;

public class Tester {

    public static void main(String[] args) {

        Map<String, Integer> stuff = new CaseInsensitiveMap<String, Integer>();

        stuff.put("happy", 11);
        System.out.println(stuff);
        Integer result = stuff.get("HAPPy");
        System.out.println(result);
        System.out.println(stuff);

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