[英]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.File
和java.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.