如何从Java对象中提取数据?

时间:2010-12-23 22:16:21

标签: java object data-structures tf-idf

我是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类中获取特定值?

4 个答案:

答案 0 :(得分:1)

对于问题一,除非你重写toString(),否则你不可能仅通过直接将对象打印到stdout来获得任何有意义的输出。 'test2.Data@19821f'是Object.toString()返回的内容 - 类名后跟对象哈希。在这种情况下,它非常有用地显示您的值都是相同的对象。

您可以使用java.io.Filejava.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,和开始计算。可能这应该是自己的问题。