关于正在增长evreytime的arrayList的排序的ArrayIndexOutOfBoundsException

时间:2013-10-16 11:24:01

标签: java sorting arraylist synchronization

方案

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

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

每次从serviceProvider获取结果集时,都会使用提供程序提供的新数据集添加此arrayList。

然后通过将此arrayList传递给我的模型中的templist,在我的视图中显示。

所以每当我得到一个结果集(或一大堆结果),我的arrayList就会更新,然后我将在模型中清除我的tempList并将新的set 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());

然后当我将sort选项更改为Sort Z-A

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

哪个叫

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

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


问题

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

所以我总是继续将对象添加到arrayList,但是我的视图然后将这个arrayList过滤到它的tempList(通过每次获取新的结果集时清除并再次添加它)。

因此,当我们进行排序时,arrayList被提供用于排序,当它完成时,我们将再次将排序的arrayList过滤到tempList(通过清除并再次添加它)。

3 个答案:

答案 0 :(得分:5)

我认为解决问题的最佳方法是将View与模型分开 - 不要工作/修改列表的同一副本。因此,您的真实来源是模型,每当用户要求以排序方式呈现它时,视图将获得副本。然后,视图可以对本地副本进行排序,而不会影响模型。如果您希望100%同步,则可以在模型中保留的列表的块更新结束时实现要调用的回调。然后视图将检索新更新的列表,对其进行排序并重新填充视图。

答案 1 :(得分:0)

同步必须位于相同的对象上。您可以使用列表作为监视器:

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

...

synchronized(arrayList) {
    // the code that adds more results
}

或者,您可以为此目的创建一个实用程序对象,并使用锁定和释放它的方法。

答案 2 :(得分:0)

在视图中进行排序,即:对临时列表进行排序,而不是对arraylist进行排序