2011-10-19 2 views
0

강사가 저에게 준 숙제 중 하나는 야구 통계 프로그램이었습니다. stats.dat라는 파일에서 읽습니다.이 파일에는 야구 선수 이름의 이름과 박쥐에있을 때 일어난 일의 목록이 들어 있습니다. 그것은 그들의 이름과 외출 (o), 히트 (h), 걷기 (w) 및 희생 플라이 (s)를 읽고 프린트합니다. 이 파일에 포함 된 내용입니다 :파일에서 통계 읽기

Willy Wonk,o,o,h,o,o,o,o,h,w,o,o,o,o,s,h,o,h 
Shari Jones,h,o,o,s,s,h,o,o,o,h,o,o,o 
Barry Bands,h,h,w,o,o,o,w,h,o,o,h,h,o,o,w,w,w,h,o,o 
Sally Slugger,o,h,h,o,o,h,h,w 
Missy Lots,o,o,s,o,o,w,o,o,o 
Joe Jones,o,h,o,o,o,o,h,h,o,o,o,o,w,o,o,o,h,o,h,h 
Larry Loop,w,s,o,o,o,h,o,o,h,s,o,o,o,h,h 
Sarah Swift,o,o,o,o,h,h,w,o,o,o 
Bill Bird,h,o,h,o,h,w,o,o,o,h,s,s,h,o,o,o,o,o,o 
Don Daring,o,o,h,h,o,o,h,o,h,o,o,o,o,o,o,h 
Jill Jet,o,s,s,h,o,o,h,h,o,o,o,h,o,h,w,o,o,h,h,o 

지금까지 내가 꽤 각 행이 무엇을하는지 이해하지 않더라도, 아래 기본적인 생각을 가지고 (나는 내 ​​수업이 책에 프로그램의 일부 코드를 수정 읽기는 텍스트 파일에있는 URL을 인쇄 한 다음 /로 분리 된 URL의 각 부분을 인쇄합니다. 나는 프로그램에서 플레이어의 이름을 출력 할 수 있도록 해 놓았지만, 히트, 아웃, 걷기, 그리고 그들이받는 희생의 양을 출력하는 방법에 대해 잘 모르겠습니다. 난 (

import java.util.Scanner; 
import java.io.*; 

public class BaseballStats 
{ 
public static void main(String [] args) throws IOException 
{ 
    int hit = 0, walk = 0, sac = 0, out = 0, length = 0, wholeLength = 0; 
    Scanner fileScan, lineScan, statScan; 
    String fileName, playerName, line, stats, playerStats; 
    Scanner scan = new Scanner(System.in); 

    System.out.println("Enter the name of the file: "); 
    fileName = scan.nextLine(); 
    fileScan = new Scanner(new File(fileName)); 

    while (fileScan.hasNext()) 
    { 
    System.out.println(); 
    line = ("Player: " + fileScan.nextLine()); 
    wholeLength = line.length(); 

    lineScan = new Scanner(line); 
    lineScan.useDelimiter(","); 

    stats = lineScan.next(); 
    statScan = new Scanner(stats); 
    statScan.useDelimiter(","); 


    while (statScan.hasNext()) 
    { 
    System.out.println(statScan.next()); 
    length = stats.length() - 1; 


    for (int i = 0; i < length; i++) 
    { 
     if (stats.charAt(i) == 'h') 
     hit++; 
     else if (stats.charAt(i) == 'o') 
     out++; 
     else if (stats.charAt(i) == 'w') 
     walk++; 
     else if (stats.charAt(i) == 's') 
     sac++; 
    } 
    } 
    System.out.println("Hits: " + hit + "\nOuts: " + out + "\nWalks: " + walk +    "\nSacrifice flies: " + sac); 
    } 
} 
} 

: 지금까지이 라인 중 1 개 문자를 읽는 것, 그것은 다음 플레이어로 다운되면 다음 2, 3 출력한다, 등 여기에 지금까지 그것을 가지고있는 코드입니다 내 코드에서 마지막 문장의 마지막 부분을 편집자에게 올바르게 표시하는 데 어려움을 겪습니다. 조금 이상하게 보일 경우 미안합니다.) 무엇이 잘못되었는지 궁금해했으며 지금까지는 이해할 수 없습니다. 올바른 길로 가야 할 것이 있습니까?

+0

for-loop 전에 통계를 인쇄 해보십시오. 힌트를 얻을 수 있습니다. – Rickard

+0

필자는 개인적으로 'line.split (",")'을 사용하고 스캐너로 엉망이 아닌 결과 배열로 작업합니다. –

답변

1

당신 같은 외모에 너무 많은 일 개 Scanner 인스턴스를 만드는 경우 : 한 번에 하나 개의 라인을 읽고 라인이 할당 fileScan :

  • 당신은 처음 스캐너를 사용합니다.
  • 그런 다음 한 번에 한 필드 씩 읽으려면 스캐너 : lineScan을 만듭니다.
  • 그러나 lineScan에서 첫 번째 토큰을 읽고 세 번째 스캐너 인스턴스 인 statsScan을 만듭니다. 이 작업을 수행하기보다는 먼저 lineScan에서 모든 토큰을 읽고 그 중 첫 번째 토큰을 사람 이름으로 저장하고 다음 토큰을 통계로 처리하기 만하면됩니다.

사람의 이름과 통계를 보관하기 위해 전용 클래스를 만들고이 클래스에 toString()을 구현하여 적절한 문자열 표현을 생성하는 것이 좋습니다. 예 : 당신은 단순히 생성 및 통계와 플레이어 클래스를 채우고 다음을 인쇄해야 toString()을 구현함으로써

public class Player { 
    private final String name; 
    private int hit, out, walk, sac; 

    public int getNumHits() { 
    return hit; 
    } 

    public int incrementNumHits() { 
    return ++hit; 
    } 

    // TODO: Implement other getter and increment methods. 

    public String toString() { 
    return String.format("%s. Hits: %d, Outs: %d, Walks: %d, Sacrifice flies: %d", 
     name, hit, out, walk, sac); 
    } 
} 

; 예 :

Player player = new Player("Jim"); 
player.incrementNumHits(); 
// etc. 
System.out.println(player); 
+0

"플레이어 클래스에 통계를 채우는 것"이 ​​무슨 뜻인지 알지 못합니다. 제 이해에서 (매우 낮습니다) 매개 변수 (예 : "Jim"은 두 번째 예제에서)는 new 연산자와 객체와 같은 줄에 있어야합니다. – mooles

+0

내 말은 플레이어 이름과 관련 통계에 대한 컨테이너 역할을하는 Player : hit, out 등을 정의하는 것입니다. 그러면 연결된 동작 (예 : incrementNumHits(), toString() 등을 정의 할 수 있습니다.)). "클래스 채우기"란 파일의 각 새 행을 읽으면 Player의 새 인스턴스를 만들고 해당하는 incrementXXX 메서드를 호출하여 읽은 상태로 통계를 대조하는 것을 의미합니다. – Adamski