2017-01-27 2 views
4

私はResultオブジェクトがすべてEventオブジェクトへの参照を保持するArrayList(Result)を持っています。 ArrayListにはおそらく50のResultオブジェクトがありますが、5つの異なるEventオブジェクトしかありません。 ArrayListをループしてグループ化する方法はありますか同じEvent.getName()参照を持つ結果はありますか?複合オブジェクトのリストをグループ化します

「ハイジャンプ」イベントで結果にメソッドを実行し、次に「ロングジャンプ」イベントでのみ結果を返すようにしたい 結果リストが保持するイベントは、あらかじめわかりませんユーザー入力から作成されます。

私はイベント名でのArrayListをソートする方法を知っているが、私はむしろ、イベントでリストを分割し、他の一時リストに保存したい

結果クラスからは(?):

public Result(double result, int attemptNumber, Participant participant, Event event) { 
    this.result = result; 
    this.attemptNumber = attemptNumber; 
    this.participant = participant; 
    this.event = event; 
} 

イベントクラスから:

public Event (String eventName, int attemptsAllowed) { 
    this.eventName = eventName; 
    this.attemptsAllowed = attemptsAllowed; 
} 

public String getEventName() { 
    return eventName; 
} 

結果オブジェクトは、ここでallResultsのコピーをトリムの種類と第三のクラスのメソッド(と呼ばれ、ArrayListに呼ばallResultsにソートされていない保存されていますresultByEvent)入力eventNameのに基づいており、参加者ごとにのみ、最高の結果を保持します:

上記
public ArrayList<Result> resultsByEvent(String eventName) { 
    resultsByEvent.addAll(allResults); 

    for(int i = 0; i < resultsByEvent.size(); i++) { 
     Event event = resultsByEvent.get(i).getEvent(); 

     if(!event.getEventName().equals(eventName)) { 
      resultsByEvent.remove(i); 
     } 
    } 

    Collections.sort(resultsByEvent, new EventLeaderboard()); 

    for(int n = 0; n < resultsByEvent.size(); n++) { 
     for(int j = n + 1; j < resultsByEvent.size(); j++) { 
      Participant participant1 = resultsByEvent.get(n).getParticipant(); 
      Participant participant2 = resultsByEvent.get(j).getParticipant(); 

      if(participant1.getParticipantId() == participant2.getParticipantId()) { 
       resultsByEvent.remove(j); 
       j = j - 1; 
      } 
     } 
    } 
    return resultsByEvent; 
} 

は、私は、元の結果リストのすべての私のイベントで実行したいものです。

+3

をあなたが投稿できます'Resのコードイベントとは? – bradimus

+2

いくつかのコードを共有してください。 – nullpointer

+1

あなたは 'java-8'ですか? – CKing

答えて

0

リストのマップを作成できます。 Key = reference、data =そのタイプの参照のリスト。

+0

私はあなたが 'Set'ではなく' Map'を意味すると思います。それでもなお、この回答を有効にするには、サンプルコードを提供してください。 – bradimus

+0

はい使用する地図は –

+0

ありがとうございます、私はマップを作成することができます:) – AgnesAronsson

3

あなたは、いくつかの名前を一致する結果を探しているときに、ちょうどList<Result> matchingResults = eventsResults.get(<some event name>)を呼び出し、「イベント名」/「は、対応する結果のリスト」のeventsResultsMapを作成することができます。

次の例では、resultsList<Result>です。

 Map<String,List<Result>> eventsResults = new HashMap<String,List<Result>>(); 

     for(Result result : results){ 

      String eventName = result.getEvent().getEventName(); 
      // search the map for this event name 
      List<Result> storedResultsList = eventsResults.get(eventName); 

      if(storedResultsList == null){ 
       // no entry for this name yet, let's create one 
       List<Result> newEventResultsList = new ArrayList<Result>(); 
       newEventResultsList.add(result); 

       eventsResults.put(eventName, newEventResultsList); 


      } 
      else{ 
       // entry found, let's add this result to the list 
       storedResultsList.add(result); 
      } 
     } 
+1

ありがとうございます!これは私が必要としていたものです: – AgnesAronsson

+1

@AgnesAronssonあなたは 'java-8'を使っていると言いました。この性質の変換に新しい' Stream' APIを使うことを強くお勧めします。代わりに私の答えを見てください。 – CKing

+1

@Bergerおそらく、 'Events :: Array :: ArrayList <>のような' EventsResults.computeIfAbsent'のような 'Map :: computeIfAbsent'を使うべきでしょう: – Flown

4

あなたはStream API使ってこれを行うことができます。イベント名によって名前

Map<String, List<Event>> eventsGroupedByName = allResults.stream().collect(
       Collectors.groupingBy(e -> e.getEvent().getName())); 

グループの結果によって

グループのイベントを

Map<String, List<Result>> resultsGroupedByEventName = allResults.stream().collect(
       Collectors.groupingBy(r -> r.getEvent().getName())); 
+0

これはきれいに見えます。ありがとうございました! – AgnesAronsson

+0

@AgnesAronsson質問のあなたのコメントは言った*はい正確には、等しくgetEventName()*でイベントをグループ化するが、イベント名で結果をグループ化するように見えます。私は両方のソリューションをJava-8で提供しています。 – CKing

関連する問題