Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何保持列表不分段(阅读说明)_Java_Android_Algorithm_Optimization - Fatal编程技术网

Java 如何保持列表不分段(阅读说明)

Java 如何保持列表不分段(阅读说明),java,android,algorithm,optimization,Java,Android,Algorithm,Optimization,我有以下问题(例如简化) 我有项由其ID标识 class Item { private int id; public int getId(){ return id; } } 我想将它们保存在一个类中(命名为ItemGroup),并满足以下条件: ItemGroup.getItems()应返回一个列表(列表不必按项目id排序) 每次我向ItemGroup添加一个新项目时,它应该只维护具有较高且连续的ID的项目。一些例子可以更好地解释这一点: 现有项=[5,6],

我有以下问题(例如简化)

我有由其ID标识

class Item {
   private int id;
   public int getId(){
      return id;
   }
}
我想将它们保存在一个类中(命名为ItemGroup),并满足以下条件:

  • ItemGroup.getItems()
    应返回一个
    列表
    (列表不必按项目id排序)
  • 每次我向
    ItemGroup
    添加一个新项目时,它应该只维护具有较高且连续的ID的项目。一些例子可以更好地解释这一点:
    • 现有项=[5,6],项添加=[7,8],结果=[5,6,7,8]
    • 现有项=[5,6],项添加=[8,9],结果=[8,9]
    • 现有项=[5,6],项添加=[3,4],结果=[3,4,5,6]
    • 现有项=[5,6],项添加=[1,2],结果=[5,6]
目标是实现聊天,其中消息以小包的形式从服务器恢复,主要需求是线程拥有最后一条消息,而不具有碎片线程(缺少消息)

例如,当客户端在版本5中,而服务器在版本1000中时,就会出现主要问题。客户端恢复最后10条消息,找到ID为(90-100)的项目。在这种情况下,我希望丢弃旧消息,允许用户向上滚动,在需要时恢复以前的消息

我如何才能有效地实施这一点?我考虑的选项有:

  • 使用
    列表
    ,每次添加新项目(或项目组)时运行Collections.sort()。然后按递减方式迭代列表,当我检测到ID跳转时,丢弃其余项目
  • 使用树集,在修改集合后以相同的方式对列表进行碎片整理。方法
    getItems()
    返回
    new ArrayList(树集)
  • 使用
    列表
    ,每次需要插入项目时,通过二进制搜索查找正确的位置,在那里插入项目,然后对列表进行碎片整理。在
    getItems()方法中返回未修改的列表。
    方法
  • 更多的解决方案

  • 谢谢

    从我假设的示例来看,我不确定您的ID是否唯一。我还假设插入列表和主列表最初都有相应的元素 如果是这样,算法将很简单:

  • 插入前对两个列表进行排序
  • 比较插入列表中的最低(第一个)元素和主列表中的最高(最后一个)元素,如果它们相差1-插入到末尾,如果相差更多-替换主列表,返回
  • 比较插入列表中的最高元素和主列表中的最低元素,如果它们相差1-插入到开头,如果它们相差超过1-放弃插入列表

  • 该算法具有O(n)的最佳案例性能(O(1)用于值比较,O(n)用于元素插入),只要列表中没有任何混乱,并且始终对其进行排序,则始终可以实现该性能。

    添加的项和现有项是否可以相交(即将[2,3]添加到[3,4])?否,项是唯一的=)。谢谢你的回答