2017-05-10 9 views
0

ファイル、HashMap、およびArrayListを使用することについては、すべて学校の割り当てがあります。この割り当てには4つのクラスが必要です。HashMapを作成して値を設定する<Integer、ArrayList <object>>

最初のクラスはFileReaderと呼ばれ、行単位で書き込まれ、必要な各フィールドは ";"で区切られたtxtファイルを読み込みます(例: "Columbia University"; "USA"; 78.86; 2012) 。各行には2つの文字列(大学名と国名)と2つの数字(スコアと年)が含まれています。 txtファイルを読み取った後のFileReaderクラスは、その内容をarraylistに返します。

割り当ての2番目のクラスはUniversityScoresと呼ばれ、4つのフィールド(uniname、country、score、year)、コンストラクタ、すべてのフィールドのアクセサメソッド、およびtoStringメソッドがあります。

3番目のクラスは、私たちのプログラムの中心です。このクラスは、FileEditorと呼ばれ、ハッシュマップを作成します。< 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"); 
    } 
} 

+2

あなたの_specific_プログラミングに関する質問は何ですか? – csmckelvey

+0

私は、どのように正しいキーと値でハッシュマップを塗りつぶすのか分かりません。 – hristoforidisc

+0

FileEditorクラスは表示されません。あなたはすでに何が働いていないのですか? – geneSummons

答えて

0

あなたは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) 
     } 
    } 

あなたのマップにはyearのスコアのプロパティに対応するIntegerキーがあることに気がついたので、地図のキーはあなたが示唆した通りの年であってスコアではないと仮定しました。

コードは機能しているかどうかは確認しませんでしたが、地図を入力する方法については少なくとも考えてください。

+0

スレッド "main"の例外java.lang.ArrayIndexOutOfBoundsException:2 FileEditor.fillHashMap(FileEditor.java:17)の TestFiles.main(TestFiles.java:27)の – hristoforidisc

+0

分割機能をチェックしてください。そして分割された線。行には4の代わりに2つの値しか入っていないようです。行とvals配列の長さを出力することで、これを行うことができます。この問題を解決するコードを修正してください。 – TM00

0

ファイルからデータを読み込み、ファイル内のデータに関する統計を生成するようになっているようです。

現在、ArrayList内の各行を単に投げているだけです。

次のステップは、そのリスト内の各項目を調べて、UniversityScoreオブジェクトを作成するように見えます。ここでは、各文字列をUniversityScoreオブジェクトのさまざまなフィールドに割り当てることができる値に解析する必要があります。これを実行したら、現在の行番号(Integerキーとして)とUniversityScore(値として)をHashMapに入れます。

これを実行したら、エディタクラスで欠落しているメソッドgetScoresOfYear(整数年)、getAverageOfYear(int年)、getMinOfYear(int年)、およびgetMaxOfYear(int年)を記述する必要があります。

+0

偉大な、ついに私が必要とするものを理解する人。あなたが私に言っている次のステップのコードを教えてください。 – hristoforidisc

-1

はこれを試してみてください。

public void fillHashMap() { 
    for(String line : lines) { 
     String [] fields = line.split(";"); 
     UniversityScores us = new UniversityScores(fields[0], fields[1], fields[2], fields[3]); 

     if (scores.keySet().contains(us.getScore())) { 
      scores.get(us.getScore()).add(us); 
     } 
     else { 
      ArrayList<UniversityScores> t = new ArrayList<UniversityScores>(); 
      t.add(us); 
      scores.put(us.getScore(), t); 
     } 
    } 

} 
+0

エラーが発生します。 FileEditor.java:17:error:互換性のない型:文字列をdoubleに変換できません。 UniversityScore us = new UniversityScore(fields [0]、fields [1]、fields [2]、fields [3]); – hristoforidisc

+0

これは別の質問です。あなたのコンストラクタはdoubleを期待しており、fields [2]やfields [3]は文字列です。あなたはそれを処理する必要があります... – geneSummons

+0

私のコンストラクタは、想定されているように書かれています。私たちが必要とするものを得るためにあなたの答えコードを変更するにはどうすればいいですか? – hristoforidisc

関連する問題