java - ArrayIndexOutOfBoundsException 对不断增长的 arrayList 进行排序

标签 java sorting arraylist synchronization

场景

我有一个类变量 arraylist,当我调用搜索时,它会从某个 serviceProvider 填充,当达到最大结果时,它将停止接收结果。

serviceProvider 以数据 block 的形式提供数据。

每次我从 serviceProvider 获得结果集时,都会将此 arrayList 添加到提供者提供的新数据集。

然后通过将此 arrayList 传递到我模型中的模板列表,将其显示在我的 View 中。

因此,每当我得到一个结果集(或一大块结果)时,我的 arrayList 就会更新,然后我将清除模型中的 tempList 并将新集 arrayList 添加到 tempList,然后重新绘制列表。

我已经为用户提供了一个在搜索过程中对列表进行排序的功能,但这实际上造成了我的问题。


问题

java.lang.ArrayIndexOutOfBoundsException
        at java/util/Collections.sort(Ljava/util/List;Ljava/util/Comparator;)V (:0:59)
        at com/test/utility/Utility.sortList(ILjava/util/List;)V (Utility.java:517:175)
        at com/test/model/contentdiscovery/SearchModel.SortSearchResults()V (SearchModel.java:701:154)  

所以发生的事情是,在搜索过程中,我对列表进行了 A-Z 排序,然后对列表进行了 Z-A 排序,同时列表正在更新。

所以我在代码中做了什么:

SortSearchResults()
{
    Utility.sortList(sort_A_Z, arrayList);  
}

哪个叫

Collections.sort(arrayList, new TitleComparatorAtoZUI());

然后当我将排序选项更改为排序 Z-A

SortSearchResults()
{
    Utility.sortList(sort_Z_A, arrayList); 
}

哪个叫

Collections.sort(arrayList, new TitleComparatorZtoAUI());  

但是每一步中的 arrayList 可能会添加更多元素。


问题

如何解决这个问题?请指教。
我已经尝试同步方法 Utility.sortListSearchModel.SortSearchResults()。它仍然造成了问题。

所以我总是不断地将对象添加到 arrayList,但是我的 View 然后将这个 arrayList 过滤到它的 tempList(每次我们得到一个新的结果集时通过清除并再次添加它)。

所以当我们做排序的时候,提供arrayList进行排序,排序完成后,我们会再次过滤出排序好的arrayList到tempList中(清空再添加)。

最佳答案

我相信解决它的最好方法就是简单地将 View 与模型分开——不要处理/修改列表的同一副本。因此,您的真实来源是模型,每次用户要求以排序方式呈现时, View 都会获得一个副本。然后 View 可以在不影响模型的情况下对本地副本进行排序。如果你想 100% 同步,你可以实现一个回调,在你保存在模型中的列表的 block 更新结束时调用。然后 View 将检索新更新的列表,对其进行排序并重新填充 View 。

关于java - ArrayIndexOutOfBoundsException 对不断增长的 arrayList 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19402111/

相关文章:

java - 查找项目是否在 Apple 中

Java Sax解析复杂的大型XML文件

java - CompletableFutures 的 JDK8 源代码中的 "relay"(UniRelay) 的目的或含义是什么?

java - Java 中的 K 最近邻实现

javascript - 如何排序列表首先开始然后包含 md-autocomplete AngularJS 中的字符串搜索

java - 从数据库中读取所有行并将它们放入 ArrayList - Java

Java Swing : How to change GUI dynamically

algorithm - 为什么我们在排序算法中使用术语 "non-descending"而不是 "ascending"?

python - 对列表的一部分进行就地排序

java - 使用 .add() 和 for 循环将多个 String 对象从 arraylist 添加到数组