2012-03-17 2 views
0

기본적으로 학생 및 마크 입력 파일을 영문자 및 ​​숫자 순으로 정렬하려고합니다. 나는 4 개의 반을 가지고 있지만 어떤 순서로든 그 반점을 가진 학생을 인쇄 할 수는 없습니다. 영문자와 숫자 순으로 혼자있게하십시오. 결과 인쇄를 전체 또는 일부 도움말로 얻는 방법에 대한 도움은 매우 감사하겠습니다. 다음은 4 개의 클래스와 입력 파일에 사용 된 코드입니다.문자열 및 별도 클래스가있는지도를 사용하여 콜렉션 정렬

입력 파일 :

Simon 4 
Anna 10 
Simon 4 
Anna 9 
Anna 5 
Edward 10 

코드 :이 키의 이상 그것이 순서를 정의하지 않도록

package part1; 
import java.io.FileReader; 
import java.util.*; 
public class Main { 
    public static void main(String[] args) throws Exception { 
     Map<String, StudentMath> map = new HashMap<String, StudentMath>(); 
     String input = "data/results.txt"; 
     Scanner scan = new Scanner(new FileReader(input)); 
     while (scan.hasNextLine()) { 
      String line = scan.nextLine(); 
      String[] in = line.split(" "); 
      String name = in[0]; 
      int mark = Integer.parseInt(in[1]); 
      //System.out.println(name + ":" + mark); 
      StudentMath stud = map.get(name); 
      if (stud == null) { 
       stud = new StudentMath(name, mark); 
       map.put(name, stud); 
       stud.sum(mark); 
      } 

     } 
     for (String s: map.keySet()){ 
      System.out.println(s); 
     } 
    } 
} 

package part1; 

public class StudentMath extends Main { 

    public String name; 
    public int mark; 

    public StudentMath(String s, int n) { 
     name = s; 
     mark = n; 
    } 

    public String getName() { 
     return name; 

    } 
    public int getMark() { 
     return mark; 
    } 

    public int sum() { 
     int tot = mark + mark; 
     return tot; 
    } 

    public boolean equals(Object o) { 
     if (o instanceof StudentMath) { 
      StudentMath m = (StudentMath) o; 
      return (name == m.name) && (mark == m.mark); 

     } 
     else { 
      return false; 
     } 
    } 
} 

package part1; 

import java.util.Comparator; 

public class NameCompare implements Comparator<StudentMath> { 
    public int compare(StudentMath g1, StudentMath g2) { 
     return g1.name.compareTo(g2.name); 
    } 
} 


package part1; 


import java.util.Comparator; 

public class MarkCompare implements Comparator<StudentMath>{ 

    public int compare(StudentMath g1, StudentMath g2) { 
     return g2.mark - g1.mark; 
    } 
} 
+0

에 정확하게 당신이'list' 당신이 삽입 순서로 다스 려하는 순서 collection.Unless하지 – amit

답변

2

HashMap는, 정렬되지 않은 모음입니다. 그래서 무작위 순서로 결과를 얻는 것입니다.

당신이 정말 Map을해야하는 경우 이러한 List (ArrayList 또는 LinkedList) 등의 순서 수집 유형을 사용하여 시도하거나 당신이 TreeMap 클래스에서 볼 수 있습니다. TreeMap은 키를 정렬하는 방법을 알고있는 Map 구현입니다. TreeMap은 값별로 정렬 할 수 없으므로 (쉽게) 마크별로 정렬 할 수 없기 때문에 여기에서 사용할 올바른 데이터 구조가 아닐 수도 있습니다.

분명히 숙제이기 때문에 코드를 제공하지 않겠지 만 올바른 방향으로 갈 수 있기를 바랍니다.

EDIT : 주문한과 동일하지 않습니다.을 입력하십시오. 실제로 List을 원하는 순서로 정렬하려면 Collections.sort 메소드를 살펴보십시오.

+0

에 문제가 무엇인지 분명하지 않다 – Cratylus

+0

@ user384706 : 음 ... 그렇습니다. 목록에서 얻은 'Iterator'의 동작은 잘 정의되어 있습니다. 목록은 항상 알려진 순서에 있고 (기본 데이터가 변경되지 않는 한) 반복자는 항상 같은 순서로 항목을 반환합니다. 'HashMap '은이 보증을 제공하지 않으므로 "순서가 없습니다". * 정렬 된 * 컬렉션은 항상 * 정렬 된 컬렉션이지만 순서가 지정된 컬렉션은 반드시 정렬되지는 않습니다. –

+0

문제는, StudentMath 클래스에 마크를 보내고 합계를 계산하여 Main 클래스에 반환해야합니다. 그러나, 나는 이것을 효과적으로 작동시키지 못합니다. – JNWarner

1

"=="를 사용하여 문자열을 비교하지 마십시오. 항상 "같음"을 사용하여 비교하십시오. 라인에

return (name == m.name) && (mark == m.mark); 

변화 그것을

return (name.equals(m.name))&& (mark == m.mark); 
관련 문제