我有数千个值存储在Java中的数组中。我想将每个值与数组中的每个其他值进行比较。
目前我正在使用两个嵌套循环进行比较。此方法导致堆空间内存错误。
以下是我目前正在使用的代码:
for(int i=0; i<arr.size(); i++)
{
for(int j=i+1; j<arr.size(); j++)
{
//CODE FOR COMPARING arr[i] and arr[j]
//performing some more operations here which contain loops and functions
}
}
哪种方法可以比较如此大量的数据?
修改 我正在使用eclipse执行此操作。
ArrayList是string类型。
我正在使用&#34; .equals&#34;
进行比较我还在循环中执行了一些操作,这需要更多的内存。
我甚至试图在循环中放置一个打印计数来知道循环执行了多少次。它执行了超过32K次。
答案 0 :(得分:2)
根据您的类型,您可以
O(N log N)
O(N)
,但这取决于您对值的处理方式。Java 8的一个好模式是使用groupingBy或者还原。
Map<String, List<MyType>> map = Stream.of(arr)
.collect(Collectors.groupingBy(mt -> mt.getKey()));
这样做是将所有条目与相同的密钥组合在一起。您可以选择一个适合您比较的钥匙。这会将具有相同键的所有条目组合到一个集合中,然后您只需要匹配具有相同键的条目。此分组可以O(n)
答案 1 :(得分:0)
我认为你的记忆结束了,因为你分配了太大的数组。因此,您可以在读取它们时将值插入HashMap,从而避免重复输入,您可以节省内存。添加到HashMap需要O(1)时间,并在已插入此元素时给出错误。希望这会有所帮助。