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亿张图纸?:-离题?这个地方正在失去控制。这是一个很好的问题,有一个合理的答案。不要浪费时间来回答这么多问题。投票重新打开。如果作者提供了一些代码,这是一个好问题,例如。。不应脱离主题IMHO
ArrayList列表;字符串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);
}