簡體   English   中英

如何從Java對象提取數據?

[英]How do I extract data from a Java object?

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

對於問題一,除非您重寫toString() ,否則僅通過將對象直接打印到stdout就不可能獲得任何有意義的輸出。 'test2.Data@19821f'是Object.toString()返回的內容-類名,后跟對象哈希。 在這種情況下,它非常有幫助地表明兩個值都是相同的對象。

您可以使用java.io.Filejava.io.FileInputStream打開/讀取文件。 從字符串到整數java.util.Map<String,Integer>的映射可能會有助於計算這些文件中的單詞。

對於這個簡單的應用程序,似乎並不需要太多的數據類。 您已經描述了要遵循的算法,這只是用Java語法編寫它的一種情況。

歡迎來到類型安全的美好世界,不用擔心內存泄漏。

您僅創建一個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));

目前尚不清楚您的問題是什么(請參閱問題下方的注釋),但是您的代碼有些錯誤。 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));

您最有可能希望看到數據字符串表示形式。

在任何對象(包括地圖)上調用println時,系統都會調用Object.toString()

對於地圖,toString方法以類似於以下格式返回地圖內容:

{ key = value, key2, value2 }

也就是說,打印它具有的鍵,值對。

現在,鍵和值也是對象,因此將調用它們自己的toString()方法。 對於字符串,其值為self。 但是,對於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()這個方法打開文件 ,並開始計數。 也許這值得提出自己的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM