2017-04-06 58 views
-2

我对Java很新,并且被困在以下任务中。我被要求在AddressBook类中创建一个方法,该方法返回总ActivityLevel最高的Person对象。如何简化我的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; 
    } 
+0

与其计算最大值然后搜索具有匹配级别的人员,不如考虑只循环一次“联系人”列表。您可以跟踪您目前为止看到的最高活动级别以及拥有该级别的人员,并且只有在列表中的下一个联系人“击败”当前最佳分数时才更新它们。 – CAW

+0

顺便说一句,还有一个简单的改进,您可以在不改变算法的情况下对当前的解决方案做出改进。目前,您在findMostSocial()方法内多次计算maxLevel()。你只需要做一次,将该值存储在一个变量中,然后比较每个人的分数。 – CAW

回答

0

我想你所需要的就是Quick Sort这里的算法来确定人员名单社交媒体活动的最大值。所以,我建议用实现QuickSort的方法替换maxValue()和findMostSocial()方法。这里有一个这样的implementation供参考。干杯