创建并填充HashMap <integer,arraylist <object =“”>&gt;

时间:2017-05-10 16:03:34

标签: java arraylist hashmap

我有一份关于使用文件,HashMap和ArrayList的学校作业。这项任务需要4个班级。

第一个类叫做FileReader,读取一个逐行写入的txt文件,我们需要的每个字段用&#34;;&#34;分隔,例如(&#34;哥伦比亚大学&#34 ;;&#34;美国&#34 ;; 78.86; 2012)。每行包含2个字符串(大学名称和国家/地区)和2个数字(分数和年份)。读取txt文件后,FileReader类将在arraylist中返回其内容。

第二类作业名为UniversityScores,它有4个字段(uniname,country,score,year),构造函数,所有字段的访问器方法和toString方法。

第三堂课是我们课程的核心。该类称为FileEditor,并创建一个Hashmap&lt; Integer,ArrayList&lt; UniversityScores&gt;&gt;其中键是每个对象的字段和值,我猜是该行的其余部分。我的问题是以正确的方式填充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");
    }
}

}

3 个答案:

答案 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