Существует функция gsub, которую вы можете использовать. Он просматривает строку с заданным шаблоном, а затем заменяет ее желаемым выводом.
gsub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,
fixed = FALSE, useBytes = FALSE)
Пример:
gsub("hello", "", a$text)
Затем, если хотите, вы можете сохранить вывод как новый столбец или новую переменную.
Есть некоторые дополнительные вещи с учетом того, что gsub чувствителен к регистру, а что нет, но их можно найти здесь . Это также имеет несколько дополнительных примеров.
Если Ваши потребности просты, рассматривают использование java.util. Таймер:
public class TimerDemo {
public static void main(String[] args) {
// non-daemon threads prevent termination of VM
final boolean isDaemon = false;
Timer timer = new Timer(isDaemon);
final long threeSeconds = 3 * 1000;
final long delay = 0;
timer.schedule(new HelloTask(), delay, threeSeconds);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MINUTE, 1);
Date oneMinuteFromNow = calendar.getTime();
timer.schedule(new KillTask(timer), oneMinuteFromNow);
}
static class HelloTask extends TimerTask {
@Override
public void run() {
System.out.println("Hello");
}
}
static class KillTask extends TimerTask {
private final Timer timer;
public KillTask(Timer timer) {
this.timer = timer;
}
@Override
public void run() {
System.out.println("Cancelling timer");
timer.cancel();
}
}
}
Как был отмечен, ExecutorService java.util.concurrent предлагает более богатый API при необходимости в нем.
Я настоятельно рекомендую cron4j (уже упоминалось) вместо Quartz, если вам не нужны некоторые из более продвинутых и сложных функций Quartz. Cron4j хорошо фокусируется на том, что он должен делать, имеет приличную документацию и не является решением для кухонной раковины.
Если Ваши объекты знают точно отдельные моменты времени, которые они хотят быть выполненными, то Вы могли использовать a java.util.concurrent.ScheduledExecutorService
. Затем они простой вызов:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
long timeToExecute = ... //read from DB? use CronTrigger?
long delayToExecution = timeToExecute - System.currentTimeMillis();
scheduler.schedule(aRunnable, delayToExecution, TimeUnit.MILLISECONDS);
Необходимо было бы только использовать Quartz
если Вы хотите, чтобы сам планировщик обработал функциональность как, "выполняются каждые 5 секунд", или если Вы хотите сложное поведение вокруг пропущенного выполнения или персистентность журнала аудита выполнения.
Можно на самом деле тривиально снова использовать Кварц CronTrigger
класс для получения "следующего времени выполнения". Класс абсолютно автономен и не зависит от того, чтобы быть вызванным из Quartz
"контекст". После того как у Вас есть следующее время выполнения как a Date
или long
, можно просто использовать Java ScheduledExecutorService
как выше
Кварц является большой и очевидной электростанцией в этой области, но существуют некоторые альтернативы для исследования.
Cron4j является достаточно достойной библиотекой, которая немного более легка, чем Кварц. Это предоставляет хорошую документацию и сделает то, что Вы хотите.
Вероятно, более интересный то, если Вы хотите пользоваться библиотекой, которая соответствует лучше библиотекам параллелизма Java (особенно Исполнители и ScheduledExecutors) затем, у HA-JDBC есть интерфейс CronExecutorService, реализованный его CronThreadPoolExecutor. Теперь, интересно, это имеет зависимость от Кварца (для обеспечения класса CronExpression), но я нахожу, что два вместе работают лучше, чем один только просто Кварц. Если Вы не хотите, чтобы большие зависимости, его легкое извлекли небольшое количество классов от Кварца и HA-JDBC, которые заставляют это произойти.
Так как Вы хотите что-то намного меньшее (просто заметил Ваше редактирование), захват CronExpression от Кварца и два класса HA-JDBC, которые я упомянул выше. Это сделает это.
Не может верить java.util. За таймер проголосовали как ответ. Кварц является действительно намного лучшим выбором.
Большое преимущество кварца по java.util. Таймер - то, что с кварцем задания могут быть сохранены в дб. В результате один jvm может запланировать, и другой может выполниться. Также (очевидно), запрос выживает через перезапуски jvm.
Возможно, более интересно, если вы хотите использовать библиотеку, которая лучше сочетается с библиотеками параллелизма Java (особенно Executors и ScheduledExecutors), тогда HA-JDBC имеет интерфейс CronExecutorService, реализованный его CronThreadPoolExecutor. Интересно, что он зависит от Quartz (для обеспечения класса CronExpression), но я нахожу, что оба вместе работают лучше, чем только Quartz. Если вам не нужны большие зависимости, легко извлечь горстку классов из Quartz и HA-JDBC, которые делают это возможным.
Я просто хотел сказать, что я попробовал извлечь эти классы, и это сработало! Мне нужны были эти три класса:
И мне пришлось сделать только эти незначительные изменения:
Я был в восторге от того, что не застрял в клубке зависимостей. Поздравляю авторов класса!
И это работает как чемпион.