2016-09-12 2 views
2

Я работаю над проектом, в котором я должен прочитать кучу свойств (свойств) из базы данных (которая находится в виде файла CSV) ,Java: чтение данных с типом, который заранее не известен

Это как файл выглядит (отформатирован немного для облегчения читаемости):

IsFast; Speed; IsRed; R; G; B 
    T; 123.4;  F; 0.0; 0.0; 1.0 
    F; 21.3;  T; 1.0; 0.0; 0.0 
... 

Как вы можете видеть, T/F представляют собой логические значения, в то время как числа с плавающей запятой. Свойства могут быть позже добавлены или удалены.

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

Путь я в настоящее время имеем дело с этим иметь следующие классы:

public abstract class Feature<T> { 
    public final String name; 
    public final T value; 

    public Feature(String name, T value) { 
     this.name = name; 
     this.value = value; 
    } 

    public abstract boolean test(T value); 
} 



public class BoolFeature extends Feature<Boolean> { 
    public BoolFeature(String name, boolean value) { 
     super(name, value); 
    } 

    @Override 
    public boolean test(Boolean value) { 
     return this.value; 
    } 
} 



public class DoubleFeature extends Feature<Double> { 
    public DoubleFeature(String name, double value) { 
     super(name, value); 
    } 

    @Override 
    public boolean test(Double value) { 
     return this.value < value; 
    } 
} 

Я тогда разбор файла CSV и создания BoolFeature объектов для входа, T/F и DoubleFeature с для других , сохраняя все это в List<Feature> или Feature[], а затем передавая эту коллекцию.

Это, однако, приводит много

Feature is a raw type. References to generic type Feature should be parameterized

и

Type safety: The method test(Object) belongs to the raw type Feature. References to generic type Feature should be parameterized

в коде, как:

public abstract class Metric { 
    protected List<Feature> features;  // this line gives warning #1 from above 

    public Metric(List<Feature> features) { 
     this.features = features; 
    } 

    public double getSplitQuality(Split split) { 
     return getImpurity(split.yes) + getImpurity(split.no); 
    } 

    public abstract double getImpurity(List<Instance> instances); 
} 

public class Split { 
    public final List<Instance> yes; 
    public final List<Instance> no; 

    public Split(List<Instance> instances, Feature feature) { 
     yes = new ArrayList<>(); 
     no = new ArrayList<>(); 
     for (Instance inst : instances) 
      if (inst.features.get(feature.name).test(feature.value)) // this line gives warning #2 from above 
       yes.add(inst); 
      else 
       no.add(inst); 
    } 
} 

public class Instance { 
    public HashMap<String, Feature> features = new HashMap<>(); 
    public String output = null; 

    public Instance(String[] featureNames, String[] csvRow) { 
     /* parse CSV row, creating BoolFeatures and DoubleFeatures 
      and adding them to the HashMap, for example: */ 
     if (csvRow[0].equals("T") || csvRow[0].equals("F")) 
      features.put(featureNames[0], new BoolFeature(featureNames[0], csvRow[0].equals("T"))); 
    } 
} 

Есть ли уборщик способ справиться с проблемой, как это?

EDIT

После добавления <?> на все ссылки на Feature, в соответствии с ответом, линия, которая ранее предупреждали # 2 теперь дает ошибку во время компиляции:

The method test(capture#2-of ?) in the type Feature is not applicable for the arguments (capture#3-of ?)

+0

Почему вы создаете объект для каждой ячейки? Когда вы говорите «а затем передаете их другому коду, который затем обрабатывает данные дальше», каков процесс вниз по течению? Вычисляет ли результат вашей строки синтаксического анализа CSV на строку? – Comencau

+0

Это случайный классификатор леса. Во время создания дерева классификации он должен пройти все функции и определить, какой из них лучше всего разбить экземпляры (строки). Это расщепление - вот почему мне нужен метод 'test'. –

+0

Вы можете попробовать аннотацию @suppresswarnings или использовать расширение объекта (шаблон) . Я не совсем уверен, чего вы хотите достичь, но это избавит вас от предупреждений. –

ответ

0

сделал свой Feature даже компилировать? Я сомневаюсь, что вы не объявили Т. Как насчет этого?

public abstract class Feature<T> { 
public final String name; 
public final T value; 

public Feature(String name, T value) { 
    this.name = name; 
    this.value = value; 
} 

public abstract boolean test(T value); 

}

У меня нет никакого предупреждения в моем затмение с любыми 3 класса больше.

+0

Не беспокойтесь; можете ли вы опубликовать фрагмент кода с предупреждениями? –

+0

Я редактировал вопрос с помощью некоторого дополнительного кода, включая строки, которые вызывают предупреждения. –

1

Ваш List<Feature> использует исходный тип Feature (как предупреждает предупреждение). Если вы знаете, какой подтип Feature вы можете использовать общий тип, например List<Feature<Boolean>>.

Однако, если вы хотите, чтобы ваши List<Feature содержать BoolFeature и DoubleFeature вы можете использовать подстановочные типа как List<Feature<?>>

+0

Я попробовал добавить '' '' '' '' функции, но столкнулся с новой проблемой. Отредактированный OP. –

Смежные вопросы