В Java, как мне отсортировать файлы в векторе по 3 различным векторам в соответствии с датой последнего изменения файла? - PullRequest
1 голос
/ 20 февраля 2012

Если у меня есть вектор, содержащий несколько несортированных файлов, как я могу классифицировать их по дате их последнего изменения?

что мне нужно сделать, это поместить файлы в 3 других вектора с последней измененной датой «Сегодня», «Вчера» и «Эта неделя».

Vector<File> files;  //This vector contains all the files that need to be categorized
Vector<File> todayFiles;  //Empty
Vector<File> yesterdayFiles;  //Empty
Vector<File> weekFiles;  //Empty

Я знаю, что могу использовать file.lastModified () для получения даты, но она возвращает дату в миллисекундах, отформатированную как long int, поэтому я не уверен, существует ли более простой способ сравнения и группировки дат без выполнения какая-то сложная арифметическая работа.

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

UPDATE

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

private Calendar cal;
private long todayTime;

this.cal = Calendar.getInstance();
this.cal.set(Calendar.HOUR_OF_DAY, 0);
this.cal.set(Calendar.HOUR, 0);
this.cal.set(Calendar.MINUTE, 0);
this.cal.set(Calendar.SECOND, 0);
this.cal.set(Calendar.MILLISECOND, 0);
this.todayTime = cal.getTimeInMillis();

Теперь, когда я пытаюсь добавить их в созданный мной вектор, он получает только те файлы, которые были изменены в PM сегодняшней даты:

for(int i = 0; i < this.files.size(); i++) {
    if(this.files.get(i).lastModified() >= this.todayTime) {
        this.today.add(this.files.get(i));  
    }
}

Есть что-нибудь, что я делаю не так? Кстати, спасибо за все замечательные ответы!

Ответы [ 3 ]

1 голос
/ 20 февраля 2012

Вы можете использовать класс Calendar для получения меток времени на требуемые даты, такие как сегодня и вчера.Например, чтобы получить текущую (полуночную) метку времени:

Calendar cal = Calendar.getInstance();
// cal initially contains current time
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);

long todayTimestamp = cal.getTimeInMillis();

Затем вы можете сравнить эту метку времени с file.lastModified() и поместить файл в соответствующий вектор.

0 голосов
/ 20 февраля 2012

Напишите функцию, которая выполняет итерацию по списку всех файлов и сравнивает дату последнего изменения каждого элемента с известными значениями сегодня, вчера и диапазона дней за последнюю неделю.Полезным фактом является то, что формат даты ISO 8601 лексикографически сопоставим, поэтому, например, (не проверено):

public static void bucketDates(List<File> inputFiles,
                               Collection<File> today,
                               Collection<File> yesterday,
                               Collection<File> lastWeek) {
  // Build date strings that match our dates of interest.
  DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
  String strToday = fmt.format(getToday());
  String strYesterday = fmt.format(getYesterday());
  String strFirstDayOfLastWeek = fmt.format(getFDOLW());
  String strLastDayOfLastWeek = fmt.format(getLDOLW());
  // Now see which bucket each input date falls into.
  for (File f : inputFiles) {
    String lastMod = fmt.format(new Date(f.lastModified()));
    if (strToday.equals(lastMod)) {
      today.add(f);
    } else if (strYesterday.equals(lastMod)) {
      yesterday.add(f);
    } else if ((strFirstDayOfLastWeek.compareTo(lastMod) <= 0)
        && (strLastDayOfLastWeek.compareTo(lastMod) >= 0)) {
      lastWeek.add(f);
    }
  }
}

Обратите внимание, что использование библиотеки дат, такой как Joda-Time , вероятно, сделаетСравнение дат проще (и, конечно, вычисление даты).

0 голосов
/ 20 февраля 2012
  1. Реализация Comparator для сортировки по lastModified .
  2. используйте Collections.sort для сортировки ваших объектов и перебора их после этого.
  3. Используйте календарь, чтобы получить начало и конец миллис каждого нужного вам интервала (сегодня, вчера, в последний раз)
  4. разделите вашу отсортированную коллекцию, используя интервалы.
  5. Если нет проблем с параллелизмом, не используйте Векторы, просто используйте ArrayList.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...