Я работаю над проектом, в котором я должен прочитать кучу свойств (свойств) из базы данных (которая находится в виде файла 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 ?)
Почему вы создаете объект для каждой ячейки? Когда вы говорите «а затем передаете их другому коду, который затем обрабатывает данные дальше», каков процесс вниз по течению? Вычисляет ли результат вашей строки синтаксического анализа CSV на строку? – Comencau
Это случайный классификатор леса. Во время создания дерева классификации он должен пройти все функции и определить, какой из них лучше всего разбить экземпляры (строки). Это расщепление - вот почему мне нужен метод 'test'. –
Вы можете попробовать аннотацию @suppresswarnings или использовать расширение объекта (шаблон) >. Я не совсем уверен, чего вы хотите достичь, но это избавит вас от предупреждений. –