2017-05-16 6 views
0

は、私が学生情報の文字列配列を持っている:各被験者におけるトッパーを見つけるためにJava &コレクションを使用するための最良の方法だろう何トパーを主題別に探す最良の方法は何ですか?

StudentNumber Integer, Subject String, mmarks integer 

ArrayList<String> strings = new ArrayList<String>(); 
strings.add("1 | Computers | 48"); 
strings.add("2 | Data Structures | 89"); 
strings.add("33 | English | 35"); 
strings.add("24 | Maths | 70"); 
strings.add("15 | Computers | 58"); 
strings.add("6 | Data Structures | 55"); 
strings.add("7 | English | 40"); 
strings.add("18 | Maths | 73"); 

for (String str : strings) { 
    String [] strArray = str.split("\\|"); 
    // in completed code 
    for (int i = 0; i < str.length(); i++) { 
     sam.put(strArray[0], strArray[2]); 
     s.add(strArray[1]); 
    } 
} 

の予想される出力

15コンピュータ
2データ構造
7英語
18数学

+0

質問。トッパーとは何ですか?あなたのコードはコンパイルできません、 'sam'と' s'は何ですか? – jiveturkey

+0

ああ待ってください。私はあなたが欲しいものを知っていると思う。 'ArrayList 'で始める必要がありますか? – jiveturkey

+0

私は知っている、それは完成したものです、私は文字列を分割しようとしていました|配列に追加すると、Map内のすべての科目をキーとして、学生番号とマークをオブジェクトの形で値として配置します。 –

答えて

2

情報を格納するResultクラスを作成します。

class Result { 
    private int studentNumber; 
    private String subject; 
    private int mark; 

    // constructor, getters and setters go here ... 
} 

変換あなたのList<String>List<Result>へ:

List<Result> results = new ArrayList<>(); 
for (String s : strings){ 
    String[] sa = s.split(" \\| "); 
    results.add(new Result(Integer.parseInt(sa[0]), sa[1], Integer.parseInt(sa[2]))); 
} 

が対象によるresultsリスト、グループからのストリームを作成し、最高のマークの付いた学生見つける:

Map<String, Integer> map = results.stream() 
     .collect(Collectors.groupingBy(Result::getSubject, 
       Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparing(Result::getMark)), r -> r.get().getStudentNumber()))); 

を印刷します結果:

map.forEach((k,v) -> System.out.println(v + " " + k)); 

15 Computers 
18 Maths 
7 English 
2 Data Structures 
関連する問題