java对ArrayList的限制和偏移量是否与mysql相当?

pprl5pva  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(514)

在mysql中,可以执行以下操作:

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

它将返回前3个结果。在java中如何实现这样的功能?
如果我有 ArrayList 奇数元素:

  1. ArrayList<String> ids = new ArrayList<String>();
  2. ids.add("1");
  3. ids.add("2");
  4. ids.add("3");
  5. ids.add("4");
  6. ids.add("5");
  7. ids.add("6");
  8. ids.add("7");
  9. ids.add("8");
  10. ids.add("9");
  11. ids.add("10");
  12. 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
我目前的做法是创建列表的子列表:

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

但当偏移量大于ID的大小时它就会中断。。。
如果ArrayList不能做到这一点,还有更好的方法吗?
编辑:
基于这两个答案,安迪的方法似乎表现得更好:

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

无流:

  1. 40960
  2. 17167
  3. 13854
  4. 10240

对于流:

  1. 303584
  2. 118060
  3. 47284
  4. 40357

编辑2:
以上的基准测试决不能依赖。有关更多信息,请参见:how do i write a correct micro benchmark in java?

hvvq6cgz

hvvq6cgz1#

  1. List<Integer> result =
  2. ids.stream()
  3. .skip(0) // Equivalent to SQL's offset
  4. .limit(3) // Equivalent to SQL's limit
  5. .collect(Collectors.toList());

跳过应该是 pagenolimit

kzmpq1sx

kzmpq1sx2#

只需钳制 subList :

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

如果您发现语法不方便,请编写一个helper方法,例如。

  1. <T> List<T> clampedSublist(List<T> list, int offset, int limit)
xkrw2x1b

xkrw2x1b3#

这可以通过流来实现:

  1. List<Integer> result =
  2. ids.stream()
  3. .skip(0) // Equivalent to SQL's offset
  4. .limit(3) // Equivalent to SQL's limit
  5. .collect(Collectors.toList());

相关问题