我是C程序员,现在我转到了Java。我试图在Java程序中转换C程序。 C程序只是简单地计算术语频率和逆文档频率(tf/idf)。
我创建了一个数据类
public class Data {
private String fileName,fileText;
private int fileId;
private float value;
public void addData(String fileName, String fileText, float value){
this.fileName = fileName;
this.fileText = fileText;
this.value = value;
}
public int getFileId(){
return this.fileId;
}
public String getFileName(){
return this.fileName;
}
public String getFileText(){
return this.fileText;
}
public float getValue(){
return this.value;
}
}
此类负责存储文件名,文件文本和值(tf值或idf值)。
以下类负责存储数据:
public class main {
public static void main(String[] args) {
HashMap<String, Data> map = new HashMap<String, Data>();
Data dt = new Data();
dt.addData("abc.txt", "some contents", 2);
map.put("1",dt);
dt.addData("w", "some more contents in second file", 3);
map.put("2",dt);
System.out.println(map);
}
}
当我打印地图时,它给了我一些奇怪的价值。我想,我必须声明数组类的数组?我不知道有多少文件,因此我不能放任何静态数组编号。
另外,如何根据此数据结构计算TF和IDF?
在C程序中,我只是简单地读取文件,计算单词除以总单词数来获得TF,并将单词除以所有文件中该单词的总出现次数以获得IDF。我不知道如何使用上面的数据结构。
我得到了奇怪的价值观。也许这些是对象:
{2=test2.Data@19821f, 1=test2.Data@19821f}
有没有办法使用getFileName
等函数从Data类中获取特定值?
答案 0 :(得分:1)
对于问题一,除非你重写toString()
,否则你不可能仅通过直接将对象打印到stdout来获得任何有意义的输出。 'test2.Data@19821f'是Object.toString()
返回的内容 - 类名后跟对象哈希。在这种情况下,它非常有用地显示您的值都是相同的对象。
您可以使用java.io.File
和java.io.FileInputStream
打开/阅读文件。从字符串到整数java.util.Map<String,Integer>
的映射可能有助于计算这些文件中的单词。
对于这个简单的应用程序,您的数据类似乎不太需要。您已经描述了要遵循的算法,它只是用Java语法编写它的一种情况。
欢迎来到类型安全的奇妙世界,不要担心内存泄漏。
答案 1 :(得分:0)
您只创建了Data
的一个实例。你可能想做更多的事情:
Data dt = new Data();
dt.addData("abc.txt", "some contents", 2);
map.put("1",dt);
dt = new Data();
dt.addData("w", "some more contents in second file", 3);
map.put("2",dt);
或者更好的是,更改Data
以获取其构造函数中的属性:
map.put("1", new Data("abc.txt", "some contents", 2));
map.put("2", new Data("w", "some more contents in second file", 3));
答案 2 :(得分:0)
目前尚不清楚您的问题是什么(请参阅问题下方的评论),但您的代码存在一些问题。对于替换对象中数据的方法,addData
是一个误导性名称。但真正的问题在于:
dt.addData("abc.txt", "some contents", 2);
map.put("1",dt);
dt.addData("w", "some more contents in second file", 3);
map.put("2",dt);
这会产生一个包含两个条目的映射,这两个条目都引用相同的 Data
对象,该对象将包含上次调用addData
时的值。将addData
更改为构造函数:
public Data(String fileName, String fileText, float value) {
然后将地图代码更改为:
map.put("1", new Data("abc.txt", "some contents", 2));
map.put("2", new Data("w", "some more contents in second file", 3));
答案 3 :(得分:0)
您很可能希望看到数据字符串表示。
当您通过任何对象(包括地图)调用println时,系统会调用Object.toString()
对于地图,toString方法返回地图的内容,格式类似于:
{ key = value, key2, value2 }
也就是说,打印它拥有的键值对。
现在,键和值也是对象,因此调用它们自己的toString()
方法。对于字符串,值是自己的。但是,在Data
的情况下,由于你没有提供自己的实现,你将得到默认值object fully qualified name @ object.hashCode()
所以你可能得到类似的东西:
{ 1 = Data@0xa6f2be, 2 = Data@0xa6f2be }
要更改此设置,您必须覆盖toString()
方法:
class Data {
... etc. etc.
public String toString() {
// return something meaningful like:
return String.format( "Data( fileName = %s, fileText = %s, etc ", this.fileName, this.fileText );
}
}
关于第二个问题,你将基本上基本以与在C中相同的方式进行。也许你应该创建一个calculate()
方法,opens the file,和开始计算。可能这应该是自己的问题。