【问题标题】:Count same lines in a file, JAVA计算文件中的相同行,JAVA
【发布时间】:2016-05-01 14:18:53
【问题描述】:

我有一个包含动物行的文本文件,这些动物在此列表中出现 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 提供的答案已经奏效,我的动物及其出现次数已用此代码计算:

java hashmap word count from a text file

现在,我只需要将所有这些信息放到一个新的 jtable 中

【问题讨论】:

  • 文件可以有多大?您可以使用什么版本的 Java?
  • ...你的问题是?另外,你现在有什么代码,你具体卡在哪里?
  • 文件大约 10 到 30 行
  • 我使用的是最新的 java 版本

标签: java file java.util.scanner readfile


【解决方案1】:

只需使用开关盒。您可以为每只动物使用一个计数器。或者使用 arrayList 来存储每只动物的数量...

   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;
            }
        }

【讨论】:

  • 如果我添加 Fox 会怎样?
  • 只需为狐狸添加另一个案例。我知道如果您想添加更多不同的动物,这不是一个好的解决方案。
  • 他可以做的另一件事是检查当前行的内容并将字符串存储在数组中。对于这个解决方案,写一个类,例如“动物”,这个类必须有一个名称的字符串属性和一个整数来计算有多少。所以他只需要在数组中存储动物的实例并更新每只动物的数量。因此,如果您添加另一种动物,只需创建一个新实例并将其存储在数组中
  • 我认为地图是更好的选择。看我的回答。
  • @UrsinusTheStrong 是的,你是对的。该地图比开关盒选项更好。但是,如果您阅读我上面的评论,您会看到我写了第二个答案。这是一个面向对象的选项。在那里你也可以实现 Map ;)
【解决方案2】:

很遗憾,我无法编写和测试代码,但我能够为您提供一条完成您想做的事情的途径。

您可以使用正则表达式匹配多少次,假设文本文件中提到了“猫”。

也许这会有所帮助:http://code.runnable.com/UqUJWzqM7L8-AAFT/how-to-count-the-number-of-matching-string-in-java-for-regex

代码不是我写的,感谢 Mirang。

【讨论】:

  • 谢谢,这看起来有点相似,但在您提供的代码中,用户有一个他想要匹配的特定行,我需要计算 5 个或更多单独字符串的匹配项跨度>
【解决方案3】:

您可以有一个Map<String, Integer>,其中 key 是动物名称,count 是迄今为止的出现次数。每次读取动物时,从地图中获取值并增加它。最后,您可以使用计数的整数值对 Map 进行排序并存储在表中。

【讨论】:

  • 谢谢!这看起来像是我的问题的正确解决方案,但老实说,我不知道如何实现它。你知道我在哪里可以找到一些Map<String, Integer> 以与我的代码类似的方式实现的示例吗?
  • 非常感谢你!该代码为您提供了您的链接有效,它计算了我所有的动物!现在我只需要对它们进行排序并将它们放入 jtable 中。
  • 对不起,不在我的电脑上,所以不能给出确切的代码,但这个网站展示了如何根据值进行排序。 mkyong.com/java/how-to-sort-a-map-in-java
【解决方案4】:

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

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);
}

【讨论】:

  • 这里我使用 StreamTokenizer 。以令牌读取文件很有用..您不必在读取后拆分文件..这里我也使用 Iterator 接口,当您想要迭代整个集合时很有用。
【解决方案5】:

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

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 的键包含动物名称和值(它是一个整数)包含到目前为止读取的动物名称的出现次数。每次迭代后,检查动物名称是否在键中。如果是,则增加其值。否则,放置一个值为 1 的新键值对。映射完成后,您可以随意使用它。

【讨论】:

    【解决方案6】:

    您可以使用 Java 8 Streams 做到这一点。该解决方案紧凑且极具表现力。它创建从文件中读取的行流。每个唯一的行成为一个组,它计算每个组中的条目,然后按组的值按降序对组进行排序。

    既然你想把这些放在一个 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" });
            }
        }
    }
    

    如果你已经有一个排序的 Map,你可以像这样转换成一个二维数组:

    Object[][] data = m1.entrySet().stream()
            .map((entry) -> new Object[] { entry.getKey(), entry.getValue() })
            .toArray(Object[][]::new);
    

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 2015-06-11
      相关资源
      最近更新 更多