Как извлечь данные из объекта Java? - PullRequest
1 голос
/ 24 декабря 2010

Я программист на C и теперь я перешел на Java. Я пытаюсь конвертировать C-программу в Java-программу. Программы на 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 на основе этой структуры данных?

В программе на Си я просто читаю файлы, подсчитываю слова, разделенные на общее количество слов, чтобы получить TF, и слово, деленное на общее вхождение этого слова во все файлы, чтобы получить IDF. Я не знаю, как это сделать, используя вышеупомянутую структуру данных.

Я получаю странные значения. Может быть, это объекты:

{2=test2.Data@19821f, 1=test2.Data@19821f}

Есть ли способ получить определенное значение из класса Data с помощью функций getFileName и т. Д.?

Ответы [ 4 ]

1 голос
/ 24 декабря 2010

По первому вопросу, если вы не переопределите toString(), вы вряд ли получите какой-либо значимый вывод, просто печатая объекты напрямую в stdout.'Test2.Data@19821f' - это то, что Object.toString() возвращает - имя класса, за которым следует хеш объекта.В этом случае довольно полезно показать, что оба ваших значения являются одними и теми же объектами.

Вы можете открывать / читать файлы, используя java.io.File и java.io.FileInputStream.Карта из строк в целые числа java.util.Map<String,Integer>, вероятно, поможет в подсчете слов в этих файлах.

Похоже, что для этого простого класса данных не требуется особый класс данных.Вы уже описали алгоритм, которому нужно следовать, это всего лишь сценарий написания его в синтаксисе Java.

Добро пожаловать в удивительный мир безопасности типов и не беспокойтесь об утечках памяти.

0 голосов
/ 24 декабря 2010

Скорее всего, вы ожидаете увидеть строковое представление данных.

Когда вы вызываете 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() метод, при котором открывает файл и начинает подсчет.Вероятно, это заслуживает отдельного вопроса.

0 голосов
/ 24 декабря 2010

Непонятно, каков ваш вопрос (см. Комментарии ниже вашего вопроса), но в вашем коде есть несколько ошибок.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);

В результате получается карта, содержащая две записи, каждая из которых ссылается на объект same 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));
0 голосов
/ 24 декабря 2010

Вы создаете только один экземпляр 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));
...