2011-05-08 2 views
1

저는 교육적인 목적으로 Java로 간단한 프로그램을 작성하려고합니다. 기본적으로 학생과 그 학년을 추가 할 수 있으며 평균 학생 학점이나 "나쁜"학생 등을 제외하고 "좋은"학생을 필터링하는 통계를 수집 할 수 있습니다. 터미널에서 응용 프로그램을 실행 한 후에는 학생을 추가 할 수 있습니다. -add <name>, 학생 등급을 다음과 같이 추가하십시오 : -addg <name> <grade>Java의 ArrayLists 사전

그래서 학생 이름과 그 성적 목록을 저장하고 싶습니다. 데이터 struture는 아주 간단합니다 (즉, 내가이 작업에 대한 적절한 구조 것 같다 적어도 지금 원하는 것입니다 그것은 Python에서 목록의 간단한 연관 PHP에서 배열의 배열 또는 사전을 나타냅니다.) :

+---------------------+---------------------+ 
| String name   | ArrayList grades | 
+---------------------+---------------------+ 
| String anotherName | ArrayList grades | 
+---------------------+---------------------+ 

을 이 PHP 또는 Python 꽤 간단한 코딩 할 것이지만, Java 내가 문제로 실행했습니다

$ javac StudentGrades.java 
StudentGrades.java:19: variable grades might not have been initialized 
       grades.add(5.0f); 
       ^
Note: StudentGrades.java uses unchecked or unsafe operations. 
Note: Recompile with -Xlint:unchecked for details. 
1 error 

StudentGrades.java :

난 그냥 같은 구조를 구축 할 수
public class StudentGrades { 

    Dictionary studentGrades; 

    /** 
    * @param args the command line arguments 
    */ 
    public void main(String[] args) { 
     //Scanner scanner = new Scanner(System.in); 
     ArrayList grades; 
     boolean res; 
     grades.add(5.0f); 
     this.studentGrades.put("Nemoden", grades); 
    } 

내가 잘못하고있는 일과 올바르게 수행해야하는 작업을 지적 해 주실 수 있습니까? 감사합니다. 정적 상황에 studentGrades를 사용하려는 경우 변수 정적도 있어야한다는, 또한

public void main(String[] args) { 
    //Scanner scanner = new Scanner(System.in); 
    ArrayList grades = new ArrayList(); 
    boolean res; 
    grades.add(5.0f); 
    this.studentGrades.put("Nemoden", grades); 
} 

:

답변

2

당신이 ArrayList grades = new ArrayList();

그러나 더 나은를 사용해야 할 것 :

은 사전을 반복하려면 개체도 생성하십시오. C++에서는 코드를 ArrayList* grades;으로 상상할 수 있습니다. 즉, 여기서 참조/포인터를 만들면됩니다.

추가 생각은 :

  1. Dictionary studentGrades;이 null로 초기화됩니다.이 정적해야하기 때문에 유효한 주 기능이 아니다
  2. public void main(String[] args)
  3. 당신이 정적 컨텍스트에서 개체 인스턴스가없는 때문에 public static void main(String[] args) 당신이 this을 사용할 수없는 경우
  4. 당신이 할 수있는 ' 그것은 추상적이기 때문에 Dictionary을 인스턴스화하지 않습니다. 하위 클래스 중 하나를 사용하십시오. new Hashtable<String, List<Float>>() 또는지도, 예 : Map<String, List<Float> dictionary = new HashMap<String, List<Float>>();
  5. 로컬 프리미티브 변수도 초기화되지 않으므로 오류도 발생할 수 있습니다. boolean res; Java에서만 클래스 멤버가 초기화되고 로컬 변수는 초기화되지 않습니다.
+0

스냅! 'ArrayList '(소문자)을 사용하려고했는데 컴파일러가 원시 타입 선언이 아닌 참조를 기대했기 때문에 그렇게하지 못했습니다. 갑자기 'float'에 대한 참조가 있습니다. – Nemoden

+0

프리미티브를 사용할 수 없지만 객체를 사용해야합니다. 플로트 대문자를 언급했다. – Thomas

+0

@ 토마스 : 실제로 자바 6을 사용한다면 프리미티브를 사용할 수 있습니다. –

1

당신은 당신의 변수를 초기화 할 필요가 당신 이후

static Dictionary studentGrades; 

자바를 교육적인 목적으로 사용하려는 경우, 기본 개념 (클래스, 가시성, 생성자, 멤버, 변수)을 배우고 컬렉션, 배열 및 API와 같은 개념으로 시작하는 것이 좋습니다. 일반적으로 또한 제네릭과 함께 컬렉션을 사용하는 것을 고려하십시오. C 또는 C는 달리 ++ 변수를 만드는 것은하지 않는 ArrayList<Float> grades = new ArrayList<Float>(); //or use Double or Number

참고 : 대신 ArrayList grades;

for (Object key : studentGrades.keySet()) { 
    Object value = studentGrades.get(key); 
    // do something with key & value 
} 
+0

그리고 Java에서 '사전'을 반복하는 방법은 무엇입니까? 보시다시피, 당신은 파이썬 프로그래머입니다. "pythonically speaking"나는 studentGrades.items()의 (name, grades)와 같은 것을하고 싶다. avg = sum (grades)/len (grades); 만약 유효한 자바가 없다면 – Nemoden

+0

@Pablo는'for (Object key : studentGrades) '로 변경해야합니다. .keySet())'. – Thomas

+0

@ 토마스 나는 파이썬과 그를 혼동했다. 나는 생각한다. – Nemoden