2012-03-17 10 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を持っている必要がある場合は、そのようなListArrayListまたはLinkedList)として、注文したコレクション型を使用してみてください、またはあなたがTreeMapクラスで見ることができる可能性があります。 TreeMapは、キーを並べ替える方法を知っているMapの実装です。 TreeMapは値で並べ替えることができないので、(簡単に)マークで並べ替えることができないため、ここで使用するデータ構造が正しくない可能性があります。

これは明らかに宿題ですが、私はあなたにコードを教えませんが、うまくいけば正しい軌道に乗ります。

EDIT:の注文と同じではありません。となります。実際にListを希望の順序に並べ替えるには、Collections.sortの方法を見てください。

+0

で問題が発生しているものをクリアしていません – Cratylus

+0

@ user384706:うーん...そうです。リストから得られた 'Iterator'の振る舞いはよく定義されています。リストは常に既知の順序であり、根底にあるデータが変更されない限り、イテレータは常に同じ順序で項目を返します。 'HashMap'はこの保証を提供しないので、「順序付けられていません」。 * sorted *コレクションは常に* ordered *コレクションですが、順序付きコレクションは必ずしもソートされません。 –

+0

問題は、私はStudentMathクラスにマークを送信し、合計を計算して、それをMainクラスに返す必要があります。しかし、私はこれを効果的に働かせることはできません。 – JNWarner

1

「==」を使用して文字列を比較することは決してありません。常に「equals」を使用して比較してください。行の

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

変更それ

return (name.equals(m.name))&& (mark == m.mark); 
関連する問題