java 是否有等同于 mysql 的数组列表的限制和偏移量?
Does java have an equivalent of mysql's limit and offset for arraylists?
在 MySQL 中你可以这样做:
select * from sometable order by id desc limit 3 offset 0;
return 前 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");
如何从这个 ArrayList
中为每个偏移量仅获得 3 个结果(如果没有更多元素剩余,则少于 3 个)?
例如,假设限制始终为 3 且 offset = 0
:
it should spit out 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));
但是当偏移量大于 ids 的大小时它会中断...
如果这不能用 arraylists 完成,有更好的方法吗?
编辑:
根据这两个答案,安迪的方法似乎表现更好:
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
编辑2:
以上基准测试绝对不应该依赖。有关详细信息,请参阅此处:How do I write a correct micro-benchmark in Java?
这可以通过流来完成:
List<Integer> result =
ids.stream()
.skip(0) // Equivalent to SQL's offset
.limit(3) // Equivalent to SQL's limit
.collect(Collectors.toList());
夹住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)
List<Integer> result =
ids.stream()
.skip(0) // Equivalent to SQL's offset
.limit(3) // Equivalent to SQL's limit
.collect(Collectors.toList());
跳过应该 pageno
次 limit
在 MySQL 中你可以这样做:
select * from sometable order by id desc limit 3 offset 0;
return 前 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");
如何从这个 ArrayList
中为每个偏移量仅获得 3 个结果(如果没有更多元素剩余,则少于 3 个)?
例如,假设限制始终为 3 且 offset = 0
:
it should spit out 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));
但是当偏移量大于 ids 的大小时它会中断...
如果这不能用 arraylists 完成,有更好的方法吗?
编辑:
根据这两个答案,安迪的方法似乎表现更好:
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
编辑2:
以上基准测试绝对不应该依赖。有关详细信息,请参阅此处:How do I write a correct micro-benchmark in Java?
这可以通过流来完成:
List<Integer> result =
ids.stream()
.skip(0) // Equivalent to SQL's offset
.limit(3) // Equivalent to SQL's limit
.collect(Collectors.toList());
夹住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)
List<Integer> result =
ids.stream()
.skip(0) // Equivalent to SQL's offset
.limit(3) // Equivalent to SQL's limit
.collect(Collectors.toList());
跳过应该 pageno
次 limit