【问题标题】:Java - Display n set of records from the list?Java - 从列表中显示 n 组记录?
【发布时间】:2017-12-18 07:01:03
【问题描述】:

我有一个list,屏幕上有大约 2000 条或更多记录,这实际上使我的页面在加载时变慢。 现在我想要实现的是我有两个按钮previousnext。最初在屏幕上显示前 50 条记录,然后单击 next 后显示另一组 50 条记录。我的object 中有一个属性(rowNum),它存储rownum

我知道传统的做法是遍历loop。但是有没有更快的方法,比如每次获取下 50 条记录时避免循环? activeCities 是包含 2000 条记录的列表,我需要对其进行迭代,每次都显示 50 条记录。 以下是我当前工作的代码。

int rowNum=0;
MyCity myCityObject; 
for(Object[] obj : activeCities) {
    myCityObject = new MyCity();
    myCityObject.setRowNum(rowNum);
    rowNum++;
    myCityObject.setCityUsers((String)obj[0]);
                    myCityObject.setCityPreferenceId(NumberUtil.convert((BigDecimal)obj[1]));
    myCityObject.setHeadOfficeId(NumberUtil.convert((BigDecimal)obj[2]));
    .
    .
    .
    myNewList.add(myCityObject);
    if(rowNum==numberReached)
        break;
}

【问题讨论】:

  • 我在这里有很多需要澄清的问题。您如何检索这些数据?你将它发送到哪里 - 通过 MVC 或通过 REST 的视图?
  • @Makoto 不,我有一个列表,其中已经有 2000 条记录。考虑到作为主列表现在我只想显示和播放列表。我已经从视图中获取了 2000 条记录。
  • 为什么要使用数组列表?我建议创建一个城市对象
  • AFAIK 的性能杀手是将这 2000 条记录从数据库传输到 Java。一旦你已经咬紧牙关,你如何迭代结果集就不再是一个问题了。
  • docs.oracle.com/javase/7/docs/api/java/util/… - 如果是 arrayList 则使用 subList

标签: java for-loop java-8 iterator


【解决方案1】:

因为你说过:它是主列表。这意味着您不会更改该数据。 您可以将列表转换为地图,

地图:

  • 关键是页码
  • 值是一个包含 50 条记录的列表

当你想进入下一个或去任何页面时,你只需按键获取数据。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    Java 8 允许将操作编写为

    List<MyCity> myNewList = Arrays.stream(activeCities, beginOffset, endOffsetExclusive)
        .map(obj -> {
          MyCity myCityObject = new MyCity();
          myCityObject.setCityUsers((String)obj[0]);
          myCityObject.setCityPreferenceId(NumberUtil.convert((BigDecimal)obj[1]));
          myCityObject.setHeadOfficeId(NumberUtil.convert((BigDecimal)obj[2]));
          .
          .
          .
          return myCityObject;
        })
        .collect(Collectors.toList());
    

    这并没有神奇地加速操作,但它确实完成了所需的操作,只处理元素,您可以在结果列表中找到其 MyCity 实例。

    原则上,您可以将此流处理转换为并行处理,但将数组元素转换为对象实例并将它们存储到列表中,即使处理所有 2000 个元素,它也不会因为并行处理而受益.我想,实际昂贵的部分是在数据库或渲染端或这些端之间的数据传输。

    【讨论】:

      【解决方案3】:

      在现实世界中,没有人会遍历内存中的所有记录以获取前 n 行(也称为分页)。

      相反,您希望在数据库级别过滤这些记录,这意味着您的 SQL 查询(当然,如果您使用 RDBS)应该为您完成所有工作。

      例如,如果您使用 MySQL,您可以尝试以下查询来获取 50 到 100 之间的记录:

      SELECT * FROM cities LIMIT 50,100;
      

      或检索前 50 行:

      SELECT * FROM cities LIMIT 50;
      

      祝你好运!

      【讨论】:

      • “在现实世界中”视具体情况而定。如果你想限制查询的数量(例如,因为到数据库的网络很慢)并且只需要提高 UI 速度,那么在前端部分(即“内存中”)进行分页是非常好的。如果限制因素是内存消耗或数据库负载,您的观点当然是有效的。
      【解决方案4】:

      您可以创建一个新属性 pageInitialNumber 来存储您的初始页码,该页码将在每次用户按下一个或上一个时修改,并首选获取大小(在您的情况下为 50)。初始值为 0。按下一个后,您将其设为 50。你明白了。之后需要在您的页面中使用每个组件上的值,例如 activeCities.get(pageInitialNumber+ incrementVariable) 其中增量变量是这样的

       int variableWhichIncrement= -1;    
       public Integer getIncrementVariable(){
           variableWhichIncrement=variableWhichIncrement+1;
           return variableWhichIncrement;
        }  
      

      你还需要在每次按下下一个或上一个按下后重置此变量值。这样你就不会迭代列表。 希望这能解决您的问题。

      【讨论】:

        猜你喜欢
        • 2021-01-23
        • 1970-01-01
        • 1970-01-01
        • 2019-04-23
        • 2018-04-29
        • 2014-10-24
        • 1970-01-01
        • 1970-01-01
        • 2016-05-06
        相关资源
        最近更新 更多