私はJavaにとって非常に新しいので、次の課題に取り組んでいます。最高のActivityLevelを持つPersonオブジェクトを返すメソッドをAddressBookクラスに作成するように求められました。Javaコードを簡略化するにはどうすればよいですか?
私はgetSocialMediaActivityLevel()、maxValue()およびfindMostSocial()メソッドを作成しました。
findMostSocialメソッドは、後の値を返しますが、割り当ての説明には「単純なアルゴリズムを設計して既存のクラスに統合する必要があります」という記述が含まれています。私は不必要なコードをたくさん使ったようですが、私がやったことをどのように単純化するかは非常に分かりません。どんな助けでも大歓迎です。
public class SocialMediaAccount {
private String userID;
private String websiteName;
private String websiteURL;
private int activityLevel;
public SocialMediaAccount(String userID, String websiteName, String websiteURL, int activityLevel) {
this.userID = userID;
this.websiteName = websiteName;
this.websiteURL = websiteURL;
this.activityLevel = activityLevel;
}
public void addSocialMediaAccount(String userID, String websiteName, String websiteURL, int activityLevel) {
SocialMediaAccount account1;
account1 = new SocialMediaAccount(userID, websiteName, websiteURL, activityLevel);
socialMediaAccounts.add(account1);
}
import java.util.ArrayList;
public class Person {
private String firstName;
private String surname;
private String mobile;
private String email;
private ArrayList<SocialMediaAccount> socialMediaAccounts;
//returns the combined ActivityLevel for all the Person's SocialMediaAccounts.
public int getSocialMediaActivityLevel(){
int total = 0;
for(SocialMediaAccount e : socialMediaAccounts){
total += e.getActivityLevel();
}
return total;
}
import java.util.ArrayList;
import java.util.Collections;
public class AddressBook {
private ArrayList<Person> contacts;
public AddressBook(){
contacts = new ArrayList<>();
}
//returns the highest combined ActivityLevel in the ArrayList contacts
public int maxValue(){
ArrayList<Integer> maxActivityLevel = new ArrayList<>();
for(Person e : contacts){
maxActivityLevel.add(e.getSocialMediaActivityLevel());
}
int maxValue = Collections.max(maxActivityLevel);
return maxValue;
}
//returns the Person object in the contacts ArrayList with the highest combined ActivityLevel
public Person findMostSocial(){
for(Person p: contacts){
if(maxValue() == p.getSocialMediaActivityLevel()){
return p;
}
}
return null;
}
maxを計算し、一致するレベルの人を検索するのではなく、「連絡先」リストを1回だけループすることを検討してください。これまでに見た最大活動レベルとそのレベルを持っている人の両方を追跡し、リスト内の次の連絡先が現在の最高得点を「打つ」場合のみ更新することができます。 – CAW
また、アルゴリズムを実際に変更することなく、現在のソリューションに簡単に改善を加えることもできます。現在、findMostSocial()メソッドの中でmaxLevel()を複数回計算します。これを一度行うだけで、変数に値を格納してから各人のスコアを比較する必要があります。 – CAW