Java ArrayIndexOutofBounds排序每次都在增长的arrayList时的异常

Java ArrayIndexOutofBounds排序每次都在增长的arrayList时的异常,java,sorting,arraylist,synchronization,Java,Sorting,Arraylist,Synchronization,场景 我有一个类变量arraylist,当我调用搜索时,它将从某个服务提供商处填充,当达到最大结果时,它将停止接收结果 serviceProvider以数据块的形式提供数据 每次我从serviceProvider获得一个结果集时,这个arrayList都会与提供程序提供的新数据集一起添加 然后,通过将此arrayList传递给模型中的模板列表,在我的视图中显示 因此,每当我得到一个结果集(或结果块)时,我的arrayList就会更新,然后我会清除模型中的tempList,将新的set array

场景

我有一个类变量arraylist,当我调用搜索时,它将从某个服务提供商处填充,当达到最大结果时,它将停止接收结果

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

每次我从serviceProvider获得一个结果集时,这个arrayList都会与提供程序提供的新数据集一起添加

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

因此,每当我得到一个结果集(或结果块)时,我的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());
Collections.sort(arrayList, new TitleComparatorZtoAUI());  
然后,当我将sort选项更改为sort Z-A时

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

Collections.sort(arrayList, new TitleComparatorAtoZUI());
Collections.sort(arrayList, new TitleComparatorZtoAUI());  
但是每个步骤中的arrayList可能会添加更多的元素


问题

如何解决这个问题?请告知。
我已尝试同步方法
实用程序.sortList
搜索模型.SortSearchResults()
。这仍然造成了问题

因此,我总是不断地将对象添加到arrayList,但是我的视图会将这个arrayList过滤到它的模板列表中(每次我们得到一个新的结果集时清除并再次添加它)


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

同步必须在同一对象上。您可以将列表用作监视器:

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

...

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

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

同步必须在同一个对象上。您可以将列表用作监视器:

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

...

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


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

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

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

在视图中进行排序,即:对templist而不是arraylist进行排序

在视图中进行排序,即:对templist而不是arraylist进行排序

您能解释一下排序导致异常的原因吗?我想的是arraylist正在更新,如果排序需要一些时间,是否会导致这种情况。更新是将新值添加到arrayList的结尾,还是?更新是将新值添加到arrayList的结尾。。然后它更新了模板列表。你能解释一下为什么排序会导致异常吗?我想的是arrayList正在更新,如果排序需要一些时间,是否会导致这种情况。更新是将新值添加到arrayList的结尾,还是?更新是将新值添加到arrayList的结尾。。然后它更新了模板列表。但是我们应该使用非最终对象进行同步吗?通过序列化,我会错过任何数据吗?列表不是最终的有什么特殊原因吗?在我看来,您在修改现有列表时,似乎将其视为有效的最终对象。但我们是否应该使用非最终对象进行同步?序列化此对象是否会丢失任何数据?列表不是最终对象是否有特殊原因?在我看来,不管怎么说,你都在有效地处理它,就像你在修改现有列表一样。。模型中有列表arrayList,视图中有tempList(每当我们在arrayList中添加一个新的集合时,该列表会被清除并用arrayList更新),这似乎是一个奇怪的选择。如果已经有单独的列表,那么为什么不对视图特定的列表进行排序,而不是对不需要排序的列表进行排序?@kiheru,没有理由。我想你误解了我的想法。@Sen,那么你应该没事,只要在每次视图触发某些相关操作时重新填充临时列表,如果主副本不可用(正在更新),则设置一个回调,在更新完成后检索更新副本以重新填充临时列表。@aviad抱歉,这真的是写给森的,但我忘了贴标签。你的解决方案看起来是一个解决问题的干净方法。实际上,我有两个清单。。模型中有列表arrayList,视图中有tempList(每当我们在arrayList中添加一个新的集合时,该列表会被清除并用arrayList更新),这似乎是一个奇怪的选择。如果您已经有了单独的列表,那么为什么不对视图特定的列表进行排序,而不是对不需要排序的列表进行排序?@kiheru,no reas