Как сравнить противоположные значения индекса массива и удаления на основе условия с вложенным циклом for? - PullRequest
0 голосов
/ 05 июня 2018

У меня есть список объектов Job (каждый объект Job состоит из id (целое число), startTime (float) и finishTime (float)), и я пытаюсь удалить конфликтующие объекты Job.Так что я сравниваю конечные записи с начальными и удаляю конфликтующие конечные записи.

У меня есть мой код:

List < Job > sortedJobs = new ArrayList < Job > ();
int SJsize = sortedJobs.size();
for (int i = SJsize - 1; i > 0; i--) {
  for (int j = 0; j < SJsize; j++) {
    if ((sortedJobs.get(i).getStartTime() > sortedJobs.get(j).getStartTime() &&
        sortedJobs.get(i).getStartTime() < sortedJobs.get(j).getFinishTime()) ||
      (sortedJobs.get(i).getFinishTime() > sortedJobs.get(j).getStartTime() &&
        sortedJobs.get(i).getFinishTime() < sortedJobs.get(j).getFinishTime())) {
        
      sortedJobs.remove(i);
    }
  }
}

Это дает мне ошибку индекса за пределами границ, но если я пытаюсь добавить i-- каждый раз, когда он удаляет элемент, цикл не сравнивает каждый элемент.Как мне написать это правильно?Спасибо

Ответы [ 4 ]

0 голосов
/ 05 июня 2018

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

public static List<Job> retrieveNotConflictedJobs(List<Job> jobs) {
    Collections.sort(jobs);

    Job prvJob = null;
    List<Job> res = new LinkedList<>();

    for(Job job : jobs) {
        if(prvJob == null || prvJob.getFinishTime() < job.getStartTime()) {
            res.add(job);
            prvJob = job;
        }
    }

    return res;
}
0 голосов
/ 05 июня 2018

Не так просто удалить элементы из списка при итерации по нему.Посмотрите на этот пост, чтобы изучить их:

https://codereview.stackexchange.com/questions/64011/removing-elements-on-a-list-while-iterating-through-it

Чтобы избежать этой проблемы, вы также можете сохранить элементы, которые хотите удалить, и удалить их после завершения итерации.

        List < Job > sortedJobs = new ArrayList < Job > ();
        int SJsize = sortedJobs.size();
        List<Job> jobsToRemove = new ArrayList<>();
        for (int i = SJsize - 1; i > 0; i--) {
          for (int j = 0; j < SJsize; j++) {
            if ((sortedJobs.get(i).getStartTime() > sortedJobs.get(j).getStartTime() &&
                sortedJobs.get(i).getStartTime() < sortedJobs.get(j).getFinishTime()) ||
              (sortedJobs.get(i).getFinishTime() > sortedJobs.get(j).getStartTime() &&
                sortedJobs.get(i).getFinishTime() < sortedJobs.get(j).getFinishTime())) {

              //save elements to remove
              jobsToRemove.add(sortedJobs.get(i));
            }
          }
        }

        //actually remove elements, when iteration over list is finished.
        sortedJobs.removeAll(jobsToRemove);
0 голосов
/ 05 июня 2018

Я не уверен, что вы подразумеваете под конфликтующими объектами работы.В любом случае, невозможно изменить коллекцию в «стандартном» цикле (после удаления некоторых объектов размер коллекции изменится, но вы будете использовать ее старый размер).Если вы действительно хотите это сделать, вы должны посмотреть на java.util.Iterator .Однако я не уверен, как это работает с вложенными циклами.

Вероятно, самым простым решением было бы создание вспомогательного списка объектов, которые вы хотите удалить.В вашем цикле просто добавьте эти элементы в этот вспомогательный цикл.После вызова цикла sortedJobs.removeAll(helperList);

0 голосов
/ 05 июня 2018

Вы должны уменьшать i каждый раз, когда удаляете объект, потому что каждый раз, когда вы удаляете объект из списка, размер списка уменьшается.Поэтому, если вы не уменьшите значение i, ваш итератор попытается получить доступ к несуществующим элементам (теперь список короче).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...