Любой знает о java.util. Реализация Map оптимизирована для низкого использования памяти?

Попробуйте console.log свои this.state.workType, потому что это может быть не то значение, которое вы думаете, это должно быть. Поскольку у вас нет случая default, функция ничего не возвращает.

Кроме того, было бы проще, если бы вы взяли workType в качестве параметра для своей функции renderImage. Я подозреваю, что ваш this.state.workType не будет таким же, как ваш a.work_type в функции workers.map. Вы можете сделать это так

const renderImage = (workType) => {
  switch (workType) {
  ...
  }
}

//and then
   workers.map((a, index) => (
                    <TouchableOpacity onPress={() => this.popUpDialog(a.id, a.work_type)}>
                      <Card>
                        {this.renderImage(a.work_type)}
                        <Text>{a.work_type}</Text>
                      </Card>
                    </TouchableOpacity>
   ))
8
задан mike g 11 March 2009 в 05:19
поделиться

9 ответов

Хорошо, реализованный это самостоятельно в конце. Я сделал сравнение скорости и нашел по сравнению с HashMap, что это было все еще немного быстрее с 4 записями, но медленнее с 5 или больше. Я сделал тесты с длинноватым списком ключей, что я пытался дать подобный состав как список случайных английских слов.

import java.util.*;

// PUBLIC DOMAIN
public class SmallMap extends AbstractMap {

    private Entry entry = null;

    public void clear() { entry = null; }
    public boolean isEmpty() { return entry==null; }    
    public int size() {
        int r = 0;
        for(Entry e = entry; e!=null; e = e.next) r++;
        return r;
    }

    public boolean containsKey(Object key) {
        for(Entry e = entry; e!=null; e = e.next){
            if(e.key.equals(key)){
                return true;
            }
        }
        return false;
    }

    public boolean containsValue(Object value) {
        for(Entry e = entry; e!=null; e = e.next){
            if(e.value==null){
                if(value==null) return true;
            }else if(e.value.equals(value)){
                return true;
            }
        }
        return false;
    }

    public Object get(Object key) {
        for(Entry e = entry; e!=null; e = e.next){
            if(e.key.equals(key)){
                return e.value;
            }
        }
        return null;
    }

    public Object put(Object key, Object value) {
        for(Entry e = entry; e!=null; e = e.next){
            if(e.key.equals(key)){
                Object r = e.value;
                e.value = value;
                return r;
            }
        }
        entry = new Entry(key, value, entry);
        return null;
    }

    public Object remove(Object key) {
        if(entry!=null){
            if(entry.key.equals(key)){
                Object r = entry.value;
                entry = entry.next;
                return r;
            }
            for(Entry e = entry; e.next!=null; e = e.next){
                if(key.equals(e.next.key)){
                    Object r = e.next.value;
                    e.next = e.next.next;
                    return r;
                }
            }
        }
        return null;
    }

    public Set entrySet() { return new EntrySet(); }

    class EntrySet extends AbstractSet{
        public Iterator iterator() {
            return new Iterator(){

                Entry last = null;
                Entry e = entry;
                public boolean hasNext() { return e!=null; }

                public Object next() { 
                    last = e;
                    e = e.next;
                    return last;
                }

                public void remove() { 
                    if(last == null) throw new IllegalStateException();
                    SmallMap.this.remove(last.key);
                }
            };
        }

        public int size() { return SmallMap.this.size();}
    }

    static private class Entry implements java.util.Map.Entry {
        final Object key;
        Object value;
        Entry next; 
        Entry(Object key, Object value, Entry next){
            if(key==null) throw new NullPointerException();
            this.key = key;
            this.value = value;
            this.next = next;
        }
        public Object getKey() { return key; }
        public Object getValue() { return value; }
        public Object setValue(Object value) { 
            Object r = this.value;
            this.value = value;
            return r;
        }
        public int hashCode() {
            return (key   == null ? 0 :   key.hashCode()) ^
               (value == null ? 0 : value.hashCode());
        }
    }
}
3
ответ дан 5 December 2019 в 14:06
поделиться

Мог взглянуть на наборы свободного городского населения Flat3Map, он оптимизирован для хранения 3 значений в 3 полях и переполнении к другой карте в 4.

Я не посмотрел на реализацию, но об этом может стоить думать. Только проблема состоит в том, что начиная с наборов свободного городского населения 1,3 совместимых нет никакого дженерика.

3
ответ дан 5 December 2019 в 14:06
поделиться

Перенесите ArrayList с интерфейсом Map. ArrayList использует только несколько байтов сам. Каждому узлу нужны два указателя, один для ключа и один для значения. Используйте последовательный поиск для поиска значений. Пока существует только немного записей, производительность будет в порядке [*]. Это даст Вам дрейф для использования реальных карт для нескольких ваз, где у Вас есть большое количество значений.

*: Скажите, что Ваш средний размер карты равняется 10. Сегодняшние компьютеры могут сравнить примерно 100 миллионов ключей в секунду, таким образом, каждый поиск займет меньше чем пять микросекунд в среднем.

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

3
ответ дан 5 December 2019 в 14:06
поделиться

Просто, я рекомендую использовать один из HashMap, Хеш-таблицы и ConcurrentHashMap JDK в зависимости от требований параллелизма или синхронизации. Если Вы решаете использовать их, устанавливая initialCapacity, и коэффициент загрузки соответственно в конструкторе может помочь.

Наборы Google и апачские наборы свободного городского населения обеспечивают больше функций: LRUMap, ReferenceMap, MultikeyMap и так далее. Но я не думаю, что нет для просто небольшого размера.

1
ответ дан 5 December 2019 в 14:06
поделиться

LinkedHashMap использует связанный список, я думаю, но я сомневаюсь, что он оптимизирован для низкого использования памяти. Обычно смысл карты должен ускорить поиски от ключа до значения, которое объясняет, почему Вы не находите то, в чем Вы нуждаетесь в общих местах. Могло бы просто быть самым легким записать Вашу собственную реализацию Map, и возможно Вы могли даже выпустить код в случае, если кому-либо еще нужно то же самое.

1
ответ дан 5 December 2019 в 14:06
поделиться

Возможно, этот ответ является немного поздним, но смотрите на проект Javolution. Это содержит реализации многих структур данных, предназначенных для встроенных и сред в реальном времени. Конкретно существует класс FastMap, который мог бы просто сделать то, что Вы хотите.

0
ответ дан 5 December 2019 в 14:06
поделиться

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

Если Вы знаете в данный момент, что существует проблема, то, извините я не знаю об одном. Однако слишком часто люди имеют дело с "идеей", что код будет slow/se большая память/и т.д...., и начните пытаться оптимизировать его впереди вместо того, чтобы делать код корректным.

Тем не менее, если Вы пишете что-то, что Вы знаете, что это имеет значение Ваш, должен иметь размеры, когда Вы идете. Например, я работаю над кодом для парсинга файлов класса, я делаю небольшое изменение и затем вижу, как он производит производительность. Например, я знал для того, что изменение, которое я внес (3 строки) заставило мою программу пойти в 4 раза медленнее... Я провел время в той точке ООН, узнавая более быстрый способ сделать это.

Кроме того, действительно ли Вы уверены, что карты необходимы, если значение "n" является маленьким? Возможно, Список достаточно быстр? Также Вы попытались настроиться, существующая Карта, чтобы иметь его используют меньше памяти?

1
ответ дан 5 December 2019 в 14:06
поделиться

Если Вы храните Strings только, смотрите на http://code.google.com/p/flatmap

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

0
ответ дан 5 December 2019 в 14:06
поделиться

Это во многом зависит от того, как Вы собираетесь использовать те карты, можно ли заполнить их в одном выстреле и затем просто сделать ли поиски (Вам нужны те поиски, чтобы быть быстрыми)?

Реализация с помощью минимального объема памяти должна была бы поместить все элементы в массив и сделать сканирование для нахождения элементов (но я предполагаю, что это не достаточно быстро для потребностей)...

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

Или возможно Вы могли использовать TreeMap при разрешении медленного времени вставки...

0
ответ дан 5 December 2019 в 14:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: