Java是否具有等效于MySQL的arraylists的限制和偏移量?

Jon*_*rte 1 java mysql list limit offset

在MySQL中,您可以执行以下操作:

select * from sometable order by id desc limit 3 offset 0; 
Run Code Online (Sandbox Code Playgroud)

这将返回前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");
Run Code Online (Sandbox Code Playgroud)

ArrayList对于每个偏移量,如何从中仅获得3个结果(如果没有更多元素,则少于3个)?

例如,说出限制是否始终为3并offset = 0

它应该吐出1,2,3

if offset = 3

4,5,6

offset = 6

7,8,9

offset = 9

10,11

我目前正在做的方式是通过创建列表的subList:

int endOf = offset+3;
ArrayList<String> ids2 = new ArrayList<String>(ids.subList(offset, endOf));
Run Code Online (Sandbox Code Playgroud)

但是当偏移量大于id的大小时,它就会中断...

如果无法使用arraylists完成,还有更好的方法吗?

编辑:

根据两个答案,安迪的方法似乎表现更好:

long startTime = System.nanoTime();
 //tried each method here
long stopTime = System.nanoTime();
System.out.println(stopTime - startTime);
Run Code Online (Sandbox Code Playgroud)

没有流:

40960
17167
13854
10240
Run Code Online (Sandbox Code Playgroud)

带流:

303584
118060
47284
40357
Run Code Online (Sandbox Code Playgroud)

编辑2:

绝对不应依赖上述基准测试。有关更多信息,为什么在这里看到:如何在Java中编写正确的微基准?

Mur*_*nik 5

这可以通过流来完成:

List<Integer> result = 
    ids.stream()
       .skip(0)  // Equivalent to SQL's offset
       .limit(3) // Equivalent to SQL's limit
       .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)


And*_*ner 5

只需钳制以下参数subList

list.subList(
    Math.min(list.size(), offset),
    Math.min(list.size(), offset + limit))
Run Code Online (Sandbox Code Playgroud)

如果发现语法不便,请编写一个辅助方法,例如

<T> List<T> clampedSublist(List<T> list, int offset, int limit)
Run Code Online (Sandbox Code Playgroud)

  • @JonathanLaliberte要记住的一件事是,流方法会创建一个新列表,而这只是返回列表的视图,即O(lim)存储与O(1)。 (2认同)
  • @JonathanLaliberte另请参阅:/sf/ask/35287241/ (2认同)