[英]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 == StringY
或StringX.equals(StringY)
,但是我不明白如何比較ArrayList
字符串,更不用說如何添加保存在String對象中的double值了(僅當該字符串為等於)。
示例類BaseBallTeam具有兩個屬性。
我想將所有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}
這里:
Collectors.toMap說您想將所有團隊收集到HashMap
t-> t.getTeamMember()表示由其teamMember(name)收集。 teamMember成為HashMap的關鍵
k-> k.getHomeRuns()表示收集其homeRun作為值
(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.