簡體   English   中英

如何比較保存在ArrayList中的對象中保存的字符串,然后將這些字符串的值相加(如果它們彼此相等)

[英]How do I compare strings held in an object which are held in an ArrayList and then add the value of those strings(if they are equal to one another)

如何比較保存在ArrayList中的對象中保存的字符串,然后將這些字符串的值相加(如果它們彼此相等)?

我知道如何檢查StringX == StringYStringX.equals(StringY) ,但是我不明白如何比較ArrayList字符串,更不用說如何添加保存在String對象中的double值了(僅當該字符串為等於)。

示例類BaseBallTeam具有兩個屬性。

  • 弦樂團隊成員例如Kat
  • 雙本壘打,例如2.0

我想將所有Kats(string)的所有homeRuns(double)加起來。 以及所有mikes等制作的所有homeRuns(double)

這是我的代碼:

ArrayList<BaseBallTeam> list = new ArrayList<>();
double totalRuns = 0;
for(int i = 0; i<list.size();i++){
   for(int j = 1; j<list.size();j++){        
    if(list.get(i).getTeamMember().equals(list.get(j).getTeamMember())){
       totalRuns += list.get(j).getHomeRuns() +list.get(i).getHomeRuns();
       System.out.println("Amount of " + list.get(i).getTeamMember() + "s hit " + totalRuns"home runs);
   }
}                   

我的代碼為所有團隊成員提供了累積頻率,而不是將兩個單獨的分數相加

您應該首先查看團隊成員的人數,然后計算他們的本壘打:

    ArrayList<BaseBallTeam> list = new ArrayList<>();
    // fill the list
    ArrayList<String> teamMembers = new ArrayList<>();
    for (int i = 0; i < list.size(); i++) {
        if (!teamMembers.contains(list.get(i).getTeamMember())) {
            teamMembers.add(list.get(i).getTeamMember());
        }
    }

    double totalRuns = 0;
    for (int i = 0; i < teamMembers.size(); i++) {
        double runs = 0;
        for (int j = 0; j < list.size(); j++) {
            if (list.get(j).getTeamMember().equals(teamMembers.get(i))) {
                runs += list.get(j).getHomeRuns();
            }
        }
        System.out.println("Amount of " + teamMembers.get(i) + "s hit " + runs + " home runs");
        totalRuns += runs;
    }
    System.out.println("Total homeruns " + totalRuns);

先前的答案效果很好。 這是一個簡化代碼並提高可讀性的想法(盡管它做同樣的事情!):

BaseBallTeam kate1 = new BaseBallTeam("Kate", 2.0);
BaseBallTeam kate2 = new BaseBallTeam("Kate", 3.0);
BaseBallTeam mike1 = new BaseBallTeam("Mike", 1.0);
BaseBallTeam mike2 = new BaseBallTeam("Mike", 5.0);
List<BaseBallTeam> list = Arrays.asList(kate1, kate2, mike1, mike2);

ArrayList<String> teamMembers = new ArrayList<>();
for(BaseBallTeam team : list){
  if(!teamMembers.contains(team.getTeamMember())){
    teamMembers.add(team.getTeamMember());
  }
}

double totalRuns = 0;

for(String teamMember : teamMembers){
  double runs = 0;
  for(BaseBallTeam team : list){
    if(team.getTeamMember().equals(teamMember)){
      runs += team.getHomeRuns();
    }
  }
  System.out.println("Amount of " + teamMember + "s hit " + runs + " home runs");
  totalRuns += runs;
}
System.out.println("Total homeruns " + totalRuns);

解決問題的最佳方法是使用Java 8功能。 您可以按名稱對所有BaseBallTeam對象進行分組,並使用java.util.stream.Collectors中的Collector對每個玩家的本壘打總數進行分組:

樣例代碼:

    BaseBallTeam kate1 = new BaseBallTeam("Kate", 2);
    BaseBallTeam kate2 = new BaseBallTeam("Kate", 2);
    BaseBallTeam mike1 = new BaseBallTeam("Mike", 4);
    BaseBallTeam mike2 = new BaseBallTeam("Mike", 2);

    List<BaseBallTeam> list = Arrays.asList(kate1, kate2, mike1, mike2);
    Map<String, Integer> map = list.stream()
            .collect(Collectors.toMap(t -> t.getTeamMember(), 
                                      k -> k.getHomeRuns(), 
                                      (t1, t2) -> t1 + t2)
                    );
    System.out.println(map);

輸出:{Mike = 6,Kate = 4}

這里:

  1. Collectors.toMap說您想將所有團隊收集到HashMap

  2. t-> t.getTeamMember()表示由其teamMember(name)收集。 teamMember成為HashMap的關鍵

  3. k-> k.getHomeRuns()表示收集其homeRun作為值

  4. (t1,t2)-> t1 + t2表示如果我們發現重復的鍵,我們希望對值求和

然后,您可以按以下方式遍歷地圖:

map.entrySet().forEach(e -> 
               System.out.println("Amount of " + e.getKey() + "s hit " + e.getValue() + " home runs"));

輸出:

Mikes命中6次本壘打

凱特斯的命中率達到了4次本壘打

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM