Есть ли в Java эквивалент лимита и смещения mysql для массивов? - PullRequest
0 голосов
/ 10 июня 2018

В MySQL вы можете сделать что-то вроде этого:

select * from sometable order by id desc limit 3 offset 0; 

Что бы вернуть первые 3 результата.Как нечто подобное достижимо в Java?

Если у меня ArrayList нечетного количества элементов:

ArrayList<String> ids = new ArrayList<String>();
ids.add("1");
ids.add("2");
ids.add("3");
ids.add("4");
ids.add("5");
ids.add("6");
ids.add("7");
ids.add("8");
ids.add("9");
ids.add("10");
ids.add("11");

Как можно получить только 3 результата из этого ArrayList для каждого смещения (или меньше, чем3, если больше не осталось элементов)?

например, скажем, если предел всегда равен 3, а offset = 0:

он должен выплевывать 1,2,3

if offset = 3:

4,5,6

offset = 6:

7,8,9

offset = 9:

10,11

В настоящее время я делаю это путем создания подспискаиз списка:

int endOf = offset+3;
ArrayList<String> ids2 = new ArrayList<String>(ids.subList(offset, endOf));

Но он ломается, когда смещение больше, чем размер идентификаторов ...

Если это невозможно сделать с массивами, есть лучший способсделать это?

РЕДАКТИРОВАТЬ:

Судя по двум ответам, метод Энди, кажется, работает лучше:

long startTime = System.nanoTime();
 //tried each method here
long stopTime = System.nanoTime();
System.out.println(stopTime - startTime);

Без потоков:

40960
17167
13854
10240

С потоками:

303584
118060
47284
40357

EDIT2:

Приведенный выше тест производительности ни в коем случае не sследует полагаться.Для получения дополнительной информации см. Здесь: Как написать правильный микро-тест на Java?

Ответы [ 2 ]

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

Просто зафиксируйте параметры subList:

list.subList(
    Math.min(list.size(), offset),
    Math.min(list.size(), offset + limit))

Если вы найдете синтаксис неудобным, напишите вспомогательный метод, например

<T> List<T> clampedSublist(List<T> list, int offset, int limit)
0 голосов
/ 10 июня 2018

Это можно сделать с помощью потоков:

List<Integer> result = 
    ids.stream()
       .skip(0)  // Equivalent to SQL's offset
       .limit(3) // Equivalent to SQL's limit
       .collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...