Слияние двух хэш-карт Android - PullRequest
3 голосов
/ 10 октября 2010

Я хочу объединить два HashMaps.

Я мог бы использовать map1.putAll (map2); но я не хочу перезаписывать ключи, так как да, у них будут конфликтующие ключи.

Таким образом, ключи на каждой карте будут такими:

word1     word1
word2     word2
word3     word3

и когда я объединяю их, я бы хотел:

word1
word2
word3
word4
word5
word6

Он может просто перезаписывать ключи, если ключи являются инкрементными, и использовать первый текст ключа, т. Е. Читает одну из пар и извлекает слово «word», поэтому каждая из них будет word1 word2.

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

Так что для начала я полагаю:

    HashMap<String, Object> hm1 = new HashMap<String, Object>();
    hm1.put("key1", "a");
    hm1.put("key2", "a");
    hm1.put("key3", "a");
    HashMap<String, Object> hm2 = new HashMap<String, Object>();
    hm2.put("key1", "1");
    hm2.put("key2", "2");
    hm2.put("key3", "3");

    HashMap<String, Object> newHM = new HashMap<String, Object>();      
    String keyWord = "";
    for (String  s: hm1.keySet()) {
        keyWord = s;
        break;
    }
    int count = 0;
    for (Object o : hm1.values()) {
        newHM.put(keyWord+count, o);
    }
    for (Object o : hm2.values()) {
        newHM.put(keyWord+count, o);
    }

Но мне интересно, насколько это эффективно? Это выглядит правильно, и есть ли лучший способ сделать это? Я не хочу использовать лишний объект без необходимости

Ответы [ 2 ]

2 голосов
/ 10 октября 2010

Если ваши ключи являются инкрементными или представляют собой простой индекс, вы должны использовать List.

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

class KeyWordedArrayList<T> extends ArrayList<T>{
    private final String keyword;

    public KeyWordedArrayList(String keyword){
        this.keyword = keyword;
    }

    public String getKeyword(){
        return keyword;
    }
}

Вы также можете сделать реализацию Map:

class KeyWordedMap<T> extends HashMap<Integer, T> {
    private final String keyword;

    public KeyWordedMap(String keyword) {
        this.keyword = keyword;
    }

    public String getKeyword() {
        return keyword;
    }

    @Override
    public void putAll(Map<? extends Integer, ? extends T> m) {
        for (Map.Entry<? extends Integer, ? extends T> entry : m.entrySet()) {
            int i = entry.getKey();
            while (this.containsKey(i)) {
                i++;
            }
            this.put(i, entry.getValue());
        }
    }
}
0 голосов
/ 10 октября 2010

Для соответствия моему примеру это будет:

@Override
public void putAll(Map<? extends String, ? extends Object> m) {
    for (Map.Entry<? extends String, ? extends Object> entry : m.entrySet()) {
        String keyWord = "";
        for (String  s: this.keySet()) {
          keyWord = s.substring(0, s.length()-1);
          break;
        }
        int i = 0;
        while (this.containsKey(i)) {
            i++;
        }
        this.put(keyWord +i, entry.getValue());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...