我有一份关于使用文件,HashMap和ArrayList的学校作业。这项任务需要4个班级。
第一个类叫做FileReader,读取一个逐行写入的txt文件,我们需要的每个字段用";"分隔,例如("哥伦比亚大学&#34 ;;"美国&#34 ;; 78.86; 2012)。每行包含2个字符串(大学名称和国家/地区)和2个数字(分数和年份)。读取txt文件后,FileReader类将在arraylist中返回其内容。
第二类作业名为UniversityScores,它有4个字段(uniname,country,score,year),构造函数,所有字段的访问器方法和toString方法。
第三堂课是我们课程的核心。该类称为FileEditor,并创建一个Hashmap< Integer,ArrayList< UniversityScores>>其中键是每个对象的年字段和值,我猜是该行的其余部分。我的问题是以正确的方式填充HashMap。
另外,我最后的第4个类叫做FileWriter,它创建一个新的txt并在其中写入。除了我的FileEditor类之外,我的所有类都应该工作。需要任何帮助。先感谢您!
编辑 我也应该写一些其他的方法。现在我的问题是FileEditor类。我还发布了包含main函数的TestFiles类。
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
class FileReader{
private String fileName;
private Scanner scanner;
private File file;
private ArrayList<String> arrayList;
private String line;
public FileReader(String otherFileName){
this.fileName = otherFileName;
this.file = new File(fileName);
}
public boolean initReader(){
try {
scanner = new Scanner(file);
}
catch (FileNotFoundException e) {
System.out.println("Just caught a FileNotFoundException.");
}
if(file.exists()){
return true;
}
else{
return false;
}
}
public ArrayList<String> readFile(){
this.arrayList = new ArrayList<String>();
while (scanner.hasNextLine()) {
this.line = scanner.nextLine();
arrayList.add(line);
}
arrayList.remove(0);
//System.out.println(arrayList);
return arrayList;
}
public void closeReader(){
scanner.close();
System.out.println("Scanner closed");
}
}
import java.util.ArrayList;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
class FileWriter{
private String path;
private PrintWriter writer;
private File outputFile;
public FileWriter(String otherPath){
this.path = otherPath;
this.outputFile = new File(path);
}
public boolean initWriter(){
try{
writer = new PrintWriter(path);
}
catch (FileNotFoundException e){
System.out.println("just caught an exception");
}
if(outputFile.exists()){
return true;
}
else{
return false;
}
}
public void writeFile(){
writer.println("The first line");
writer.println("The second line");
writer.println("Christos");
}
public void closeWriter(){
writer.close();
System.out.println("Writer closed");
}
}
class UniversityScore{
private String name;
private String country;
private double score;
private int year;
public UniversityScore(String otherName, String otherCountry, double otherScore, int otherYear){
this.name = otherName;
this.country = otherCountry;
this.score = otherScore;
this.year = otherYear;
}
public String getName(){
return name;
}
public String getCountry(){
return country;
}
public double getScore(){
return score;
}
public int getYear(){
return year;
}
public String toString(){
String outputString = name + "\t" + country + "\t" + score + "\t" + year;
return outputString;
}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
class FileEditor{
private HashMap<Integer, ArrayList<UniversityScore>> scores = new HashMap<Integer, ArrayList<UniversityScore>>();
private ArrayList<String> lines;
public FileEditor(ArrayList<String> otherLines){
this.lines = otherLines;
}
public void fillHashMap(){
// that's where I need help
}
}
public class TestFiles {
public static void main(String[] args){
FileReader reader = new FileReader("universities.txt");
if(reader.initReader()){
FileEditor editor = new FileEditor(reader.readFile());
reader.closeReader();
editor.fillHashMap();
FileWriter writer = new FileWriter("universities_2015_output.txt");
if(writer.initWriter()){
writer.writeFile(editor.getScoresOfYear(2015));
writer.closeWriter();
}
else{
System.out.println("Error creating file");
}
System.out.println("Average university score of year 2015: "+editor.getAverageOfYear(2015));
System.out.println("Min university score of year 2015: "+editor.getMinOfYear(2015));
System.out.println("Max university score of year 2015: "+editor.getMaxOfYear(2015));
}
else{
System.out.println("Error opening file");
}
}
}
答案 0 :(得分:1)
您需要一种方法将行分解为UniversityScore
个对象。
现在您已经拥有了所有分数,您可以根据它们的年份值(可能是分数但类型不匹配也没有实际意义)将其添加到地图中,例如:
for(String line : lines){
String[] vals = line.split(";");
UniversityScore score = new UniversityScore(vals[0],vals[1],Double.parseDouble(vals[2]),Integer.parseInt(vals[3]))
if(scores.containsKey(score.getYear()){ // If the key exists
scores.get(score.getYear()).add(score);
}else{ // If the key doesn't exist, it must be created and added to the map
ArrayList<UniversityScore> newList = new ArrayList<>();
newList.add(score);
scores.put(score.getYear(), newList)
}
}
我注意到你的地图有一个Integer
键,对应于乐谱的year
属性,所以我假设地图的键是年份而不是你建议的分数。
我没有检查代码是否有效,但它至少应该让您了解如何填充地图。
答案 1 :(得分:0)
看起来您的任务是从文件中读取数据,然后生成有关文件中数据的一些统计信息。
目前,您只需要在ArrayList中填写每一行。
看起来您的下一步是浏览该列表中的每个项目,并创建一个UniversityScore对象。在这里,您必须将每个字符串解析为可以分配给UniversityScore对象中各个字段的值。完成后,将当前行号(作为Integer键)和UniversityScore(作为值)放在HashMap中。
完成后,您必须在编辑器类中编写缺少的方法getScoresOfYear(Integer year),getAverageOfYear(int year),getMinOfYear(int year)和getMaxOfYear(int year)。
答案 2 :(得分:-1)
试试这个:
array