Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算文件中相同的行数,JAVA_Java_File_Java.util.scanner_Readfile - Fatal编程技术网

计算文件中相同的行数,JAVA

计算文件中相同的行数,JAVA,java,file,java.util.scanner,readfile,Java,File,Java.util.scanner,Readfile,我有一个文本文件,其中有几行动物,它们在这个列表中出现了1到n次。我需要阅读这个文本文件,计算所有单独的动物事件,将它们从最高到最低排序,并将它们放在一个jtable中 例如,文本文件如下所示: dog sheep cat horse cat tiger cat cat tiger 我需要这样计算所有相同的事件: dog 1 sheep 1 cat 4 horse 1 tiger 2 然后从高到低对它们进行排序,然后以某种方式将它们放入一个表中,这样就可以: Animal name: cou

我有一个文本文件,其中有几行动物,它们在这个列表中出现了1到n次。我需要阅读这个文本文件,计算所有单独的动物事件,将它们从最高到最低排序,并将它们放在一个jtable中

例如,文本文件如下所示:

dog
sheep
cat
horse
cat
tiger
cat
cat
tiger
我需要这样计算所有相同的事件:

dog 1
sheep 1
cat 4
horse 1
tiger 2
然后从高到低对它们进行排序,然后以某种方式将它们放入一个表中,这样就可以:

Animal name: count
cat          4
tiger        2
dog          1
sheep        1
horse        1
所以,现在我的具体问题是如何计算所有不同动物的匹配数

谢谢你的帮助


编辑 Vishal Kamat提供的答案是有效的,我的动物和它们出现的次数都用这个代码计算:


现在,我只需要将所有这些信息放到一个新的jtable中,不幸的是,我无法编写和测试代码,但我可以为您提供一条实现所需操作的路径

您可以使用Regex匹配多少次,比如文本文件中提到了“cat”

或许这将有助于:


我没有写代码,归功于米朗。

你可以有一张
地图
,其中关键是动物的名字,计数是目前为止发生的事情。每次你读一个动物,从地图上获取值并增加它。最后,您可以使用计数的整数值对映射进行排序,并将其存储在表中。

您可以使用Java8流进行此操作。此解决方案紧凑且极具表现力。它创建从文件读取的行流。每个唯一的行成为一个组,它统计每个组中的条目,然后按其值按降序对组进行排序

既然你想把它们放在一个JTable中,你需要一个二维数组

package com.test;

import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import javax.swing.JTable;

public class TestCount {

    public static void main(String args[]) throws URISyntaxException, IOException {
        // for absolute path use: Paths.get("/path/to/animals.txt")
        try (Stream<String> stream = Files.lines(Paths.get(TestCount.class.getClassLoader().getResource("animals").toURI()))) {

            Object[][] data = stream
                    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())).entrySet().stream()
                    .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
                    .map((entry) -> new Object[] { entry.getKey(), entry.getValue() })
                    .toArray(Object[][]::new);

            // print the data
            for (Object[] row : data) {
                System.out.println(Arrays.toString(row));
            }

            // create the JTable
            new JTable(data, new String[] { "animal", "count" });
        }
    }
}

就用开关箱吧。你可以为每只动物使用一个计数器。或者使用一个数组列表,您可以在其中存储每种动物的数量

   String line = reader.readLine();
        while (line != null) {
            switch (line) {
                case "cat":
                catCounter++;
                break;
                case "dog":
                dogCounter++;
                break;
                case "horse":
                horseCounter++;
                break;
                case "tiger":
                tigerCounter++;
                break;
                case "sheep":
                sheepCounter++;
                break;
                default:
                break;
            }
        }

如果你方便的话,你可以试试这个

HashMap map=new HashMap();
HashSet set=new HashSet();
FileInputStream fis=new FileInputStream(file);
StreamTokenizer st=new StreamTokenizer(fis);
while(st.nextToken()!=StreamTokenizer.TT_EOF){

     Integer count=1;
     String s;
     switch(st.ttype)
     {
          case StreamTokenizer.TT_WORD:
          s=st.sval;
          if(map.containsKey(s))
          {
               count=(Integer)map.get(s);
               count++;
               map.put(s,count);
               set.add(s);
          }
          else
          {
               map.put(s,count);
               set.add(s);
          }
          break;
     }
}
//now you have a collection of words with their frequency.it will automatically sort numeric values
System.out.println("frequency of each word in file");
Iterator iter=set.iterator();//get all the keys from the HashSet

//display them with help of Iterator interface
while(iter.hasNext())
{
     String s=(String)iter.next();
     Integer count=(Integer)map.get(s);
     System.out.println("frequency of "+s+" : "+count);
}

这里的大多数答案要么太复杂,要么没有正确地实现频率分布。以下是我的解决方案:

Map<String, Integer> frequency = new HashMap<>();

try (Scanner scanner = new Scanner(new File("path/to/file"), "UTF-8")) {
    while (scanner.hasNext()) {
        String temp = scanner.nextLine();
        if(frequency.containsKey(temp)) {
            Integer count = frequency.get(temp);
            frequency.put(temp, Integer.sum(count, 1));
        } else {
            frequency.put(temp, 1);
        }
    }
}
Map frequency=newhashmap();
try(Scanner Scanner=new Scanner(新文件(“path/to/File”),“UTF-8”)){
while(scanner.hasNext()){
字符串温度=scanner.nextLine();
if(频率容器(温度)){
整数计数=频率。获取(温度);
输入频率(温度,整数和(计数,1));
}否则{
频率。输入(温度,1);
}
}
}

地图的键包含动物名称,值(为整数)包含到目前为止读取的动物名称。每次迭代后,检查动物名称是否在键中。如果是,则增加其值。否则,请放置一个值为1的新键值对。一旦地图被填充,您可以随意使用它。

文件可以有多大?您可以使用什么版本的Java?…您的问题是?还有,你现在有什么代码,具体在哪里?文件大约有10到30行,我使用的是最新的java版本,看起来有点类似,但是在你提供的代码中,用户有一行他想要匹配的代码,我需要计算5个或更多单独的StringsHanks的匹配!这看起来是解决我问题的正确方法,但老实说,我不知道如何实现它。你知道我在哪里可以找到一些以类似于我的代码的方式实现
Map
的示例吗?这可能会帮助你非常感谢你!代码提供给你你的链接工作,它计算了我所有的动物!现在我只需要对它们进行排序,并将它们放在一个jtable中。很抱歉,我的电脑没有这样做,因此无法给出确切的代码,但本网站展示了如何根据值进行排序。如果我添加一只狐狸会发生什么?只需为狐狸添加另一个案例。我知道如果你想添加更多不同的动物,这不是一个好的解决方案。他可以做的另一件事是检查当前行的内容并将字符串存储在数组中。对于这个解决方案,编写一个类,例如“animal”,这个类的名称必须有一个String属性,并有一个整数来计算有多少个。所以他只需要在数组中存储动物的实例,并更新每个动物的数量。因此,如果您添加了另一个动物,只需创建一个新实例并将其存储在Array中,我认为映射是一个更好的选择。看看我的答案。@UrsinusTheStrong是的,你是对的。映射比开关盒选项更好。但是如果你读了我上面的评论,你会发现我写了第二个答案。。这是一个面向对象的选项。在那里,您也可以实现Map;)这里我使用StreamTokenizer。在令牌中读取文件是有用的。。您不必在读取后拆分文件。在这里,我还使用迭代器接口,当您想要迭代整个集合时,它非常有用。
Map<String, Integer> frequency = new HashMap<>();

try (Scanner scanner = new Scanner(new File("path/to/file"), "UTF-8")) {
    while (scanner.hasNext()) {
        String temp = scanner.nextLine();
        if(frequency.containsKey(temp)) {
            Integer count = frequency.get(temp);
            frequency.put(temp, Integer.sum(count, 1));
        } else {
            frequency.put(temp, 1);
        }
    }
}