Хранение пары примитивов в Java HashMap

Попробуйте это.

Там, где я написал SeeMyScoresViewController, вы должны написать свой класс View Controller, в который вам нужно перейти (например, Class of Home)

NSArray *viewControllers = [[self navigationController] viewControllers];
for( int i=0;i<[viewControllers count];i++){
    id obj=[viewControllers objectAtIndex:i];
    if([obj isKindOfClass:[SeeMyScoresViewController class]]){
        [[self navigationController] popToViewController:obj animated:YES];
        return;
    }
}
6
задан Brian Tompsett - 汤莱恩 4 March 2019 в 09:27
поделиться

6 ответов

Вы просто делаете это следующим образом:

Map<Long, Integer> count = new HashMap<Long, Integer>();
for (File file : files) {
  long size = file.getTotalSpace();
  Integer n = count.get(size);
  if (n == null) {
    count.put(size, 1);
  } else {
    count.put(size, n + 1);
  }
}

Здесь происходит некоторая автоматическая упаковка и распаковка.

15
ответ дан 8 December 2019 в 03:11
поделиться

Вместо использования new Long (size) вы должны использовать Long.valueOf (size) . который вернет ту же самую длинную ссылку, которая кэшируется во внутреннем кэше, а также повысит производительность (не то, чтобы она была видна, если вы не выполните миллионы этих новых операций Long () ).

ps. работает только с java 1.5 и выше

6
ответ дан 8 December 2019 в 03:11
поделиться

Вы можете использовать Trove для хранения пар (long, int) - TLongIntHashMap

4
ответ дан 8 December 2019 в 03:11
поделиться

или вы может использовать AtomicInteger как изменяемое целое число.

Map<Long, AtomicInteger> count = new HashMap<Long, AtomicInteger>();
for (File file : files) {
  long size = file.length(); // getTotalSpace() get the space consumed (e.g. a multiple of 8K) rather the actual file size.
  AtomicInteger n = count.get(size);
  if (n == null) {
    count.put(size, new AtomicInteger(1));
  } else {
    n.getAndIncrement();
  }
}
3
ответ дан 8 December 2019 в 03:11
поделиться

Расширение того, что написал Клетус.

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

Map<Long, Collection<File>> count = new HashMap<Long, Collection<File>>();
for (File file : files) {
long size = file.getTotalSpace();
Collection<File> c = count.get(size);
if (c == null) {
    c = new ArrayList<File>(); //or whatever collection you feel comfortable with
    count.put(size, c);
}
    c.add(file);
} 

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

1
ответ дан 8 December 2019 в 03:11
поделиться

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

Вы упомянули:

... из-за того, что каждый Long obj уникален.

Я не думаю, что это эта проблема. Хотя это может быть правдой в зависимости от того, как вы создаете экземпляр Long, это не должно мешать HashMaps вести себя так, как вы хотите. Пока два ключевых объекта возвращают одно и то же значение hashCode (), а метод equals () говорит, что они равны, ваш HashMap не будет создавать для него другую запись. Фактически, у вас не должно быть возможности увидеть «список (размер файла, 1)» с одинаковыми значениями размера файла (если вы не написали свой собственный Long и не смогли правильно реализовать hashCode () / equals ()).

Тем не менее, код Cletus должен работать, если вы используете Java 5 или выше, если вы используете Java 1.4 или ниже, вам нужно будет либо вручную выполнить упаковку / распаковку, либо заглянуть в Apache Коллекции общин . Вот пример Cletus до версии Java 5:

Map count = new HashMap();
for (Iterator filesIter = files.iterator(); filesIter.hasNext();) {
  File file = (File)filesIter.next();
  long size = file.getTotalSpace();
  Integer n = count.get(size);
  if (n == null) {
    count.put(size, Integer.valueOf(1));
  } else {
    count.put(size, Integer.valueOf(n.intValue() + 1));
  }
}
1
ответ дан 8 December 2019 в 03:11
поделиться
Другие вопросы по тегам:

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