Java 如何在ArrayList中找到重复次数最多的字符串?
我有一个Java 如何在ArrayList中找到重复次数最多的字符串?,java,collections,Java,Collections,我有一个ArrayList,其中一列是数据时间秒等 我想找到特定日期和时间的最大重复次数(不含秒)。可能是,, e、 g.10具有以下参数的值2012年12月23日21:00:。 所以必须说明的是,比如说,只需要在左边的15个符号进行比较 关键是我没有一个可以比较的值,因为我不是在寻找特定的值,我是在寻找最大的重复次数,当然还有这个值本身,它给出了最大的重复次数ArrayList按降序排序,最早日期在前,最晚日期在后数组列表大小相当大,1.7亿个RAW 那么,我如何完成这项任务呢 谢谢这个主意很
ArrayList
,其中一列是数据时间秒等
我想找到特定日期和时间的最大重复次数(不含秒)。可能是,,
e、 g.10具有以下参数的值2012年12月23日21:00:。
所以必须说明的是,比如说,只需要在左边的15个符号进行比较
关键是我没有一个可以比较的值,因为我不是在寻找特定的值,我是在寻找最大的重复次数,当然还有这个值本身,它给出了最大的重复次数ArrayList
按降序排序,最早日期在前,最晚日期在后<代码>数组列表大小相当大,1.7亿个RAW
那么,我如何完成这项任务呢
谢谢这个主意很简单。我们将利用
ArrayList
已排序这一事实。我们将线性扫描列表。我们将跟踪当前项目的计数。当项目更改为其他项目时,我们将当前计数与迄今为止看到的最大计数进行比较。如果它更大,我们用跟踪的项目替换最大计数和最大项目,然后重新开始计数。我将调用您的ArrayList
列表
ArrayList<String> list;
String currentMax;
int maxCount = 0;
String current;
int count = 0;
for(int i = 0; i < list.size(); i++) {
String item = parse(list.get(i));
if(item.equals(current)) {
count++;
}
else {
if(count > maxCount) {
maxCount = count;
currentMax = current;
}
count = 1;
current = item;
}
}
拥有一个
HashMap
并将
放入其中,迭代列表
增加映射
中的日期计数(如果存在),或者在映射
中添加一个新条目@TheNewIdiot以获得1.7亿张图纸?:-离题?这个地方正在失去控制。这是一个很好的问题,有一个合理的答案。不要浪费时间来回答这么多问题。投票重新打开。如果作者提供了一些代码,这是一个好问题,例如。。不应脱离主题IMHOArrayList列表;字符串currentMax;int maxCount=0;串电流;整数计数=0;对于(int i=0;imaxCount){maxCount=count;currentMax=current;}count=1;current=item;}您需要编写<代码>解析> <代码>例程,将<>代码>字符串/<代码>映射到<代码> ARARYLIST列表到您想考虑的日期和时间而不是秒的部分。杰森非常感谢您的解决方案。我用一个小文件检查了它,它可以工作,但是当我尝试用8gb csv文件做同样的事情时,在线程“main”java.lang.OutOfMemoryError中计算6-7分钟后,我得到了以下错误:java.lang.String.substring中的java堆空间位于java.lang.String中,java.lang.String.split中的子字符串(未知源)位于java.lang.String.split中的split(未知源)(未知源代码)位于ddffdf.main(ddffdf.java:18)文件是否已排序?如果是这样,我建议不要尝试将整个文件读入ArrayList
,而是实现与我上面给出的解决方案完全相同的解决方案,而不是通过ArrayList
,而是一行一行地通过文件。对于我提供给wor的解决方案,您不需要将所有内容都存储在内存中k、 但是,这是假设文件已排序。好的,我尝试实现Jason上次提出的建议,即直接将文件馈送到循环中。但是现在我遇到了一个问题,现在结果是应该的两倍。知道为什么吗?处理时间显著减少。因此我使用while循环而不是for循环。while((br.readLine()!=null){String item=br.readLine().substring(0,19)…其余部分与上面的代码相同。有什么建议吗?好的,我找到了一个解决方案。问题是我在循环中使用了readLine 2次,所以它检查了条件,然后读取了第二行,所以workround-while((line=br.readLine())!=null){String item=line.substring(0,19)…其余部分如上述代码所示。
static int length = "dd.mm.yyyy hh:mm".length();
static String parse(String item) {
return item.substring(0, length);
}