Поиск специальной записи в списке и отображение 5 записей выше и 5 записей ниже этой записи - PullRequest
0 голосов
/ 02 июня 2018

Попытка найти конкретную запись в списке и после этого создать подсписок, который содержит 11 записей, т.е. 5 записей над выбранной записью и 5 записей под этой записью.

Возможные сценарии

  • Если выбранный список является первой записью, то следует создать только подсписок с 5 записями под этой записью.
  • Если выбранный список является первой записью, а записей меньше, чем 5, создатьподсписок со всеми записями ниже этой записи.
  • Если выбранный список является последней записью, то создать только подсписок с 5 записями над этой записью.
  • Если выбранный список является последней записью изаписей меньше, чем 5, создайте подсписок со всеми записями ниже этой записи.

Ниже мой текущий мыслительный процесс, безусловно, будет добавлена ​​дополнительная проверка в этом подходе, есть ли лучший способ или любой другойпредложение

    int s = myList.indexOf(tests);
        if (s == 0) {
            if (s + 2 < myList.size()) {
                myList = myList.subList(s, s + 3);
            } else {
                myList = myList.subList(s, s);

            }

        } else if (s == 0 && s + 1 > myList.size()) {
            myList = myList.subList(s, s);
        } else if (s - 1 > 0 && s + 1 < myList.size()) {
            myList = myList.subList(s - 1, s + 2);
        } else if (s + 1 >= myList.size()) {
            myList = myList.subList(s - 1, s + 1);

        } else if (s == myList.size() - 1) {
            if (s - 2 > 0) {
                myList = myList.subList(s - 2, s + 1);
            } else {
                myList = myList.subList(s, s + 1);

            }

        }

1 Ответ

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

Попробуйте,

List<String> records = Arrays.asList("one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
        "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen");
final List<String> subRecords = IntStream.range(0, records.size()).filter(i -> records.get(i).equals("eight"))
        .mapToObj(i -> records.subList(Math.max(i - 5, 0), Math.min(i + 6, records.size())))
        .flatMap(List::stream).collect(Collectors.toList());

Обратите внимание, я использую List из String в качестве исходных записей.Измените его в соответствии с вашим.

В качестве альтернативы можно сделать то же самое, например:

final int midIdx = records.indexOf("eight");
final int lowerBound = Math.max(midIdx - 5, 0);
final int upperBound = Math.min(midIdx + 5, records.size());
final List<String> subRecords = IntStream.range(0, records.size()).limit(upperBound + 1).skip(lowerBound)
        .mapToObj(records::get).collect(Collectors.toList());

Обновление

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

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