chrips:
以下は繰り返しが私のDataCsvLoaderで起こって見ることができます。
私は、使用中イマイチメソッドgetCsvAsMapを持っています。明らかにそれは地図を取得することかもしれないがため、すべてのTは赤...コンパイラdoesntのTがあるから出て入力することを取得する方法を知っている...それを渡すためにそこに方法は何ですか?
ハンドラとして別のクラスを作成するための唯一の方法は、具体的getCsvAsMap方法のために...ですか?
Sincrerely、Tricky4me
DataCsvLoader:
//
// Read and cache CSVs
//
public Map<Integer, CourseEntity> getAllCourses() {
String csvPath = "courses.csv";
// Create a new course Map with the right Entity type
Map<Integer, CourseEntity> entityMap = new HashMap<>();
repositoryInMem.put(csvPath, entityMap);
// Get data from CSV
EntityLoader<CourseEntity> entityLoader = new EntityLoader<>();
entityMap = entityLoader.readCsv(csvPath);
return entityMap;
}
public Map<Integer, StudentEntity> getAllStudents() {
String csvPath = "students.csv";
// Create a new course Map with the right Entity type
Map<Integer, StudentEntity> entityMap = new HashMap<>();
repositoryInMem.put(csvPath, entityMap);
// Get data from CSV
EntityLoader<StudentEntity> entityLoader = new EntityLoader<>();
entityMap = entityLoader.readCsv(csvPath);
return entityMap;
}
public Map<Integer, TestEntity> getAllTests() {
String csvPath = "tests.csv";
// Create a new course Map with the right Entity type
Map<Integer, TestEntity> entityMap = new HashMap<>();
repositoryInMem.put(csvPath, entityMap);
// Get data from CSV
EntityLoader<TestEntity> entityLoader = new EntityLoader<>();
entityMap = entityLoader.readCsv(csvPath);
return entityMap;
}
public Map<Integer, MarkEntity> getAllMarks() {
String csvPath = "marks.csv";
// Create a new course Map with the right Entity type
Map<Integer, MarkEntity> entityMap = new HashMap<>();
repositoryInMem.put(csvPath, entityMap);
// Get data from CSV
EntityLoader<MarkEntity> entityLoader = new EntityLoader<>();
entityMap = entityLoader.readCsv(csvPath);
return entityMap;
}
public Map<Integer, T> getCsvAsMap(String fileName, Map<Integer, T> entityMap){
// Add the Entity map to the repository in Mem
// The key to each entity map is just it's filename
repositoryInMem.put(fileName, entityMap);
// Get data from CSV
EntityLoader<T> entityLoader = new EntityLoader<T>();
entityMap = entityLoader.readCsv(fileName);
return entityMap;
}
EntityLoader:
public class EntityLoader<T> {
public Map<Integer, T> readCsv(String csvFile){
Map<Integer, T> table = new HashMap<>(); // Fits entire CSV table
int rowCount=0;
try {
String row;
BufferedReader csvReader = new BufferedReader(new FileReader(csvFile));
while ((row = csvReader.readLine()) != null) {
String[] data = row.split(",");
table.put(rowCount++, Arrays.asList(data));
}
csvReader.close();
}catch (FileNotFoundException e){
System.err.println("No file with name " + csvFile +
"Are the CSV files in the root folder? Ex: ReportCard\\courses.csv");
}catch (IOException e) {
System.err.println(e.getMessage());
}
}
}
Kalesh Kaladharan:
あなたのようなルックスは、物事にオブジェクト指向の道を行っていません。同様の性質を持つクラスは、抽象化を使用する必要があります。
この問題を解決するための手順に従ってください。
- インターフェイスを作成
IEntity
し、すべてのエンティティで同じように実装します。例えば、MarkEntity
として定義することができます。
public class MarkEntity implements IEntity {
// class implementation
}
- 変更し
getCsvAsMap()
、次へ
public Map<Integer, IEntity> getCsvAsMap(String fileName, Map<Integer, IEntity> entityMap){
}
- 変更
EntityLoader
するクラスを
public class EntityLoader<T extends IEntity> {
// Class implementation
}
それは行う必要があります。
編集します
抽象化は、エンティティが任意の機能を共有していない場合、またはとして、不可能な場合はgetCsvMap()
2番目の引数として同じ戻り値の型を返す必要があり、次の交換がうまく動作するはずです。
public <T> Map<Integer, T> getCsvAsMap(String fileName, Map<Integer, T> entityMap)