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中编写正确的微基准?
这可以通过流来完成:
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)
只需钳制以下参数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)
| 归档时间: |
|
| 查看次数: |
760 次 |
| 最近记录: |