2014-10-22 3 views
0

두 개의 다른 프로그램이 있습니다. 하나는 "addGrade"메소드를 포함하고 있는데,이 클래스는 새로운 등급을 2D 배열 (gradeTable)에 추가하도록 설계되었습니다. 2D 배열의 한 배열은 각 등급이 속해야하는 범주이고 두 번째 요소는 각 범주의 등급입니다. 이 프로그램은 다음과 같습니다.파일에서 읽어 들여서 2D 배열에 추가하기

public class GradeBook { 


private String name; 
private char[] categoryCodes; 
private String[] categories; 
private double[] categoryWeights; 
private double[][] gradeTable; 

public GradeBook(String nameIn, char[] categoryCodesIn, 
    String[] categoriesIn, double[] categoryWeightsIn) { 

    name = nameIn; 
    categoryCodes = categoryCodesIn; 
    categories = categoriesIn; 
    categoryWeights = categoryWeightsIn; 
    gradeTable = new double[5][0]; 
} 

public boolean addGrade(String newGradeIn) {  

    char row = newGradeIn.charAt(0); 
    int grade = Integer.parseInt(newGradeIn.substring(1)); 

    double[] oldArr = gradeTable[row]; 
    double[] newArr = Arrays.copyOf(oldArr, oldArr.length + 1); 
    newArr[newArr.length - 1] = grade; 
    gradeTable[row] = newArr; 

    return row != 0; 
} 

두 번째 프로그램은 파일에서 명령 인수로 읽습니다. 굵게 표시된 텍스트는 읽는 성적을 나타냅니다. 문자는 각 학년이 속해야하는 카테고리를 나타내며 그 수는 실제 성적입니다. 이 파일은 내가 파일의 각 학년까지 루프를 시도하고 그것은 2 차원 배열에 추가 할 수 있도록 그 위에 addGrade 메소드를 호출하고있어, 두 번째 프로그램에서

Student1 
5 
a Activities 0.05 
q Quizzes 0.10 
p Projects 0.25 
e Exams 0.30 
f Final 0.30 
**a100 a95 a100 a100 a100 
q90 q80 q100 q80 q80 r90 
p100 p95 p100 p85 p100 
e77.5 e88 
f92** 

입니다. 각 개별 학년마다이 방법을 호출하는 방법을 잘 모르겠습니다. 또한 addGrade 메서드가 옳지 않다는 것을 확신합니다. 어떤 도움을 주시면 감사하겠습니다. 이것은 두 번째 프로그램입니다 :

public class GradeBookApp { 

    String fileName = ""; 
    String name = ""; 
    char[] categoryCodes = new char[5]; 
    String[] categories = new String[5]; 
    double[] categoryWeights = new double[5]; 
    double[][] gradeTable; 


    if (args.length > 0) { 

    for (int i = 0; i < args.length; i++) { 
     System.out.println("Reading file \"" + args[i] + "\"." 
      + "\n\tCreating GradeBook object." 
      + "\n\tAdding grades to GradeBook object." 
      + "\nProcessing of file complete."); 


     fileName = args[i]; 
     Scanner scanFile = new Scanner(new File(fileName)); 

     name = scanFile.nextLine(); 
     int catCodes = Integer.parseInt(scanFile.nextLine()); 

     for (i = 0; i < catCodes; i++) { 
      String[] all = scanFile.nextLine().split(" "); 
      if(all.length == 3 && all[0].length() == 1 && all[2].matches("(\\d+\\.\\d+)")){ 
       categoryCodes[i] = all[0].charAt(0); 
       categories[i] = all[1]; 
       categoryWeights[i] = Double.parseDouble(all[2]); 
      } 
     } 

     GradeBook myGB = new GradeBook (name, categoryCodes, 
      categories, categoryWeights); 

답변

0

당신은 ArrayList<Double>보다는 double[] 같은 등급의 각 목록을 갖는 더 나을 것입니다. JVM (및 프로그래머!)에서 매번 전체 배열을 복사해야하므로 길이를 늘리고 새 배열을 추가 할 필요가 있습니다. 당신이 ArrayList<Double> gradeList를 사용하는 경우, 당신은

gradeList.add(grade); 

모두 복사 할 필요없이 할 수 있습니다.

또한 배열보다 큰 구조를 Map으로 생각하는 것이 좋습니다. 따라서 2 차원 배열을 사용하는 대신 행을 해당 행의 성적 목록에 매핑하는 HashMap<Character,List<Double>>을 사용할 수 있습니다. 따라서 현재 (암시 적으로) 수행중인 문자와 복식간에 변환하지 않아도됩니다.

마지막으로, addGrade() 방법은 오히려 String보다는 chardouble (행과 새로운 등급)를 가지고 에게서는 : 부적절한 데이터 구조를 처리하는 데에 자신을 위해 많은 일을하고 있습니다.

각 항목에 대해 addGrade을 호출하는 것이 매우 쉬워야합니다. 난 당신이 더 필요하면 더 많은 정보를 제공해야합니다 생각

char row = gr.charAt(0); 
double grade = Double.parseDouble(gr.substring(1)); 
gradeMap.get(row).add(grade); 

: 당신이 다음과 같이 당신의 HashMap gradeMap 내부 목록에 추가 할 수있는 특정 등급 (예를 들어, String gr = "e77.5")를 나타내는 String을 추출하면 그것보다 도움이.

+0

배열을 사용해야합니다. 나는 파일을 읽고 다른 변수와 배열에 요소를 추가하는 두 번째 프로그램에 추가했다. 파일의 처음 몇 줄을 끝내었지만, 각 개별 학년의 다른 파일에서 addGrade 메서드를 호출하는 데 문제가 있습니다. – me123

+0

@ me123 왜 배열을 사용해야합니까? (이것은 신발의 발 뒤꿈치로 손톱을 부딪 치고 망치를 제공하는 사람을 찾은 것, 그리고 그가 매우 감사한다고 회신하지만 그는 신발을 사용하고 있습니다.) –

+0

lol, 예 알고있다. 나는 항상 ArrayList를 사용했고 배열에 대해 더 많이 알고 싶습니다. 바보 같지만 배열을 사용하는 방법을 실제로 알고 있다는 것을 알고 싶습니다. – me123

0

파일에서 읽어야한다고했지만 파일에서 실제로 읽는 코드는 없습니다. 이것은 귀하의 첫 번째 단계가되어야합니다. 파일 입출력 작업을 수행하는 적절한 방법과 관련하여 BufferedReader 설명서 및이 사이트의 수많은 게시물을 살펴보십시오.

다음과 같이 2D gradeTable 배열에 성적을 저장한다고 가정합니다. {Category, grade}. 파일의 각 행 (BufferedReader에는이 메서드가 있음)을 읽고, 범주 및 등급으로 문자열 (String 설명서, 특히 split 또는 substring/indexOf 메서드 살펴보기)을 구문 분석 한 다음 배열을 채 웁니다.

보다 동적 인 데이터 구조 (예 : ArrayList)를 사용하십시오.이렇게하면 더 많은 성적을 추가 할 때 크기를 확장 할 수있을뿐만 아니라 크기가 확장 될 때마다 배열을 새 배열로 복사 할 필요가 없습니다.

+0

파일을 읽는 두 번째 방법에서 추가했습니다. 나는 파일의 처음 7 행을 읽었지만 개별 성적에 문제가 있습니다. 또한 배열을 사용해야합니다. – me123

관련 문제