计算文件中相同的行数,JAVA
我有一个文本文件,其中有几行动物,它们在这个列表中出现了1到n次。我需要阅读这个文本文件,计算所有单独的动物事件,将它们从最高到最低排序,并将它们放在一个jtable中 例如,文本文件如下所示:计算文件中相同的行数,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
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);
}
}
}