Вы можете либо использовать итератор прямо так, как вы упомянули, либо сохранить вторую коллекцию и добавить каждый элемент, который хотите удалить, в новую коллекцию, а затем удалитьAll в конце. Это позволяет вам использовать безопасность типа для каждого цикла за счет увеличения использования памяти и времени процессора (не должно быть огромной проблемой, если у вас нет действительно больших списков или действительно старого компьютера)
public static void main(String[] args)
{
Collection<Integer> l = new ArrayList<Integer>();
Collection<Integer> itemsToRemove = new ArrayList<Integer>();
for (int i=0; i < 10; ++i) {
l.add(new Integer(4));
l.add(new Integer(5));
l.add(new Integer(6));
}
for (Integer i : l)
{
if (i.intValue() == 5)
itemsToRemove.add(i);
}
l.removeAll(itemsToRemove);
System.out.println(l);
}
Необходимо удостовериться, что Вы заботитесь об именах файлов с более тогда одной точкой. пример: c:\.directoryname\file.name.with.too.many.dots.ext
не был бы обработан правильно strchr
или find.
, Мой фаворит будет библиотека файловой системы повышения , которые имеют расширение (путь) функция
_splitpath, _wsplitpath, _splitpath_s, _wsplitpath_w
я думаю, что это - Windows (SDK Платформы) только?
Принятие Вас имеет доступ к STL:
std::string filename("filename.conf");
std::string::size_type idx;
idx = filename.rfind('.');
if(idx != std::string::npos)
{
std::string extension = filename.substr(idx+1);
}
else
{
// No extension found
}
Редактирование: Это - кросс-платформенное решение, так как Вы не упоминали платформу. Если Вы будете конкретно в Windows, Вы захотите усилить Windows определенные функции, упомянутые другими в потоке.
Лучший способ не состоит в том, чтобы записать код, который делает это, но называет существующие методы. В окнах метод PathFindExtension является, вероятно, самым простым.
Итак, почему Вы не записали бы свое собственное?
ну, возьмите strrchr пример, что происходит, когда Вы используете тот метод на следующей строке "c:\program files\AppleGate.Net\readme"? "Действительно ли.Net\readme" является расширением? Легко записать что-то, что работает на несколько случаев в качестве примера, но может быть намного более твердо записать что-то, что работает на все случаи.
Действительно ли это слишком просто из решения?
#include <iostream>
#include <string>
int main()
{
std::string fn = "filename.conf";
if(fn.substr(fn.find_last_of(".") + 1) == "conf") {
std::cout << "Yes..." << std::endl;
} else {
std::cout << "No..." << std::endl;
}
}
Использование std :: string find / rfind решает ЭТУ проблему, но если вы много работаете с путями, вам следует взглянуть на boost :: filesystem :: path, так как это сделает ваш код намного чище. чем возиться с необработанными строковыми индексами / итераторами.
Я предлагаю Boost, поскольку это высококачественная, хорошо протестированная (с открытым исходным кодом и коммерчески) бесплатная и полностью переносимая библиотека.