Попробуйте это.
Там, где я написал 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;
}
}
Вы просто делаете это следующим образом:
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);
}
}
Здесь происходит некоторая автоматическая упаковка и распаковка.
Вместо использования new Long (size)
вы должны использовать Long.valueOf (size)
. который вернет ту же самую длинную ссылку, которая кэшируется во внутреннем кэше, а также повысит производительность (не то, чтобы она была видна, если вы не выполните миллионы этих новых операций Long ()
).
ps. работает только с java 1.5 и выше
Вы можете использовать Trove для хранения пар (long, int) - TLongIntHashMap
или вы может использовать 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();
}
}
Расширение того, что написал Клетус.
Его решение прекрасное, за исключением того, что оно хранит только каждый встреченный вами размер файла и количество файлов с таким размером. Если вы когда-нибудь захотите узнать, какие это файлы, эта структура данных будет бесполезна для вас, поэтому я не думаю, что решение 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 (), и вы можете легко перебирать все файлы с этим номером без необходимости повторять эту процедуру.
Я думаю, что это еще не все, и нам потребуется от вас более подробная информация. Я предполагаю, что вы знаете, что определенно существует более одного файла заданного размера, иначе я сначала проверил бы, что это так. Насколько вам известно, у вас просто много файлов с уникальными размерами.
Вы упомянули:
... из-за того, что каждый 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));
}
}