代码之家  ›  专栏  ›  技术社区  ›  Jonathan Laliberte

Java是否有等同于MySQL对数组列表的限制和偏移?

  •  1
  • Jonathan Laliberte  · 技术社区  · 6 年前

    在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个结果呢? 数组列表 对于每个偏移量(如果没有更多的元素,则小于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));
    

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

    如果不能用ARARYLIST来做,还有更好的方法吗?

    编辑:

    基于这两个答案,安迪的方法似乎表现得更好:

    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?

    2 回复  |  直到 6 年前
        1
  •  5
  •   Andy Turner    6 年前

    只需钳制 subList :

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

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

    <T> List<T> clampedSublist(List<T> list, int offset, int limit)
    
        2
  •  2
  •   Andy Turner    6 年前

    这可以用流来完成:

    List<Integer> result = 
        ids.stream()
           .skip(0)  // Equivalent to SQL's offset
           .limit(3) // Equivalent to SQL's limit
           .collect(Collectors.toList());
    
        3
  •  0
  •   Simon.S.A.    5 年前
    List<Integer> result = 
        ids.stream()
           .skip(0)  // Equivalent to SQL's offset
           .limit(3) // Equivalent to SQL's limit
           .collect(Collectors.toList());
    

    跳过应该是 pageno 时代 limit