在Java中,如何计算数组中单词的出现次数?

在Java中,如何计算数组中单词的出现次数?,java,arrays,arraylist,Java,Arrays,Arraylist,我正在做一个项目,在这个项目中,我必须将文件中的数据读入我的代码,在txt文件中,我有几列数据,并且我已经设法用这个代码将每列数据分离成一个数组 public static void main(String[] args) { String line = ""; String date = ""; ArrayList<String> date = new ArrayList<String>(); try { FileRe

我正在做一个项目,在这个项目中,我必须将文件中的数据读入我的代码,在txt文件中,我有几列数据,并且我已经设法用这个代码将每列数据分离成一个数组

public static void main(String[] args) {

    String line = "";
    String date = "";
    ArrayList<String> date = new ArrayList<String>();

    try {
        FileReader fr = new FileReader("list.txt");
        BufferedReader br = new BufferedReader(fr);

        while ((line = br.readLine()) != null) {
            line.split("\\s+");
            date.add(line.split("\\s+")[0]);
            System.out.println(line.split("\\s+")[0]);
        }
    } catch (IOException e) {
        System.out.println("File not found!");
    }
但是,我想计算单词“Feb”的出现次数,例如,它会出现

“二月发生的月份:2次”


但是我正在努力寻找正确的代码,有人能帮我解决这个问题吗?我已经尝试了24个多小时,任何帮助都将不胜感激,我找不到任何其他对我有帮助的问题

为了简单起见,您可以简单地使用正则表达式,比如

Pattern p = Pattern.compile("Feb", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("30-Nov-2016, 06-Oct-2016, 05-Feb-2016, 04-Sep-2016, 18-Apr-2016, 09-Feb-2016, 22-Oct-2016, 20-Aug-2016, 17-Dec-2016, 25-Dec-2016");
int count = 0;
while (m.find()) {
    count++;
}
System.out.println("Count = " + count);
if (line.toLowerCase().concat("feb")) {
    count++;
}
根据输入,将是
2

现在,很明显,如果你一次读取一个文件中的每个值,这不是很有效,只需使用类似于

Pattern p = Pattern.compile("Feb", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("30-Nov-2016, 06-Oct-2016, 05-Feb-2016, 04-Sep-2016, 18-Apr-2016, 09-Feb-2016, 22-Oct-2016, 20-Aug-2016, 17-Dec-2016, 25-Dec-2016");
int count = 0;
while (m.find()) {
    count++;
}
System.out.println("Count = " + count);
if (line.toLowerCase().concat("feb")) {
    count++;
}
会更简单更快

更新。。。 因此,根据提供的输入数据和以下代码

Pattern p = Pattern.compile("Feb", Pattern.CASE_INSENSITIVE);
int count = 0;
try (BufferedReader br = new BufferedReader(new InputStreamReader(Test.class.getResourceAsStream("Data.txt")))) {
    String text = null;
    while ((text = br.readLine()) != null) {
        Matcher m = p.matcher(text);
        if (m.find()) {
            count++;
        }
    }
    System.out.println(count);
} catch (IOException ex) {
    Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}
它打印
67

现在,这是蛮力法,因为我正在检查整条线。为了克服文本中可能出现的不匹配,您应该使用公共分隔符(即制表符)分隔行,并检查第一个元素,例如

String[] parts = text.split("\t");
Matcher m = p.matcher(parts[0]);

另一种解决方案可以是使用
split

String month = "Feb";
int count = 0;
while ((line = br.readLine()) != null) 
{
   String strDate = line.split("\\s+")[0]; // get first column, which has date
   String temp = strDate.split("\\-")[1]; // get Month from extracted date.
   if (month.equalsIgnoreCase(temp))
   {
      count++;
      // or store strDate into List for further process.
   }
}
System.out.println (count);// should print total occurrence of date with Feb month
==编辑==


因为,您正在使用
line.split(\\s+”[0]
,从每个
行中提取日期,这意味着实际字符串,只包含日期的字符串将是提取字符串。

您可以简单地使用正则表达式那将是什么表达式?它们是逗号分隔的还是换行的?它们是新行,我只是把逗号放在我自己身上,因为我不知道如何正确地表达它,现在有人做了,我会编辑它。谢谢你们,就一个关于匹配器的问题。我的列表只是一个示例,它有近1000个日期,当我尝试使用p.matcher放置整个数组时,例如p.matcher(date);我有一条红线,它根本无法计算。我不认为有任何方法可以输入匹配器的每个日期。好吧,假设你从文件加载数据,你“可以”使用StringJoiner构建字符串值或在读取每行时使用第二个示例基本上这是我的代码ideone.com/Wdg98E,这是txt文件m.uploadedit.com/bbtc/1515392705314.txt,现在它显示txt文件的第一列,所有日期,因此我捕获了数组中的第一列,现在我想输出2月份有多少份合同,所以匹配单词“feb”,但是您给我的代码与用户名数组(我在这里更改为最新的)不匹配。非常感谢您,这个选项也有帮助,我为自己的笨拙道歉,我意识到我没有发布足够的信息。对不起,根本不起作用。恐怕,谢谢你的帮助Ravi:(它只是一直在计算0,根本没有检测到二月,@jonlajoey你在说什么..它工作正常。你确定
line
只有日期吗?你能在每次迭代中共享
line
的值吗?基本上这是我的代码,这是txt文件,现在它正在显示txt文件的第一列,所有日期,所以我捕获了数组中的第一列,现在我想输出2月份的合同数量,所以匹配单词“feb”在那个阵列中是我试图做的,但我似乎无法让它工作。希望如此helps@jonlajoey您没有提到这一点,因为您有许多其他数据,并且您已经提取了第一列,其中有日期。因此,显然,您不会得到计数。这就是我在每次迭代中询问行的值的原因。对了,我向Ravi道歉,tha这就是为什么我试图制作单独的数组,这样我就可以对每一个数组进行计数,有没有可能?