【问题标题】:How can I simplify my Java code?如何简化我的 Java 代码?
【发布时间】:2017-04-06 13:00:34
【问题描述】:

我对 Java 非常陌生,并且被困在以下作业中。我被要求在 AddressBook 类中创建一个方法,该方法返回具有最高总 ActivityLevel 的 Person 对象。

我已经创建了 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;
     }

【问题讨论】:

  • 与其计算最大值然后搜索具有匹配级别的人,不如考虑只循环一次“联系人”列表。您可以跟踪迄今为止看到的最高活动级别以及拥有该级别的人,并且仅当列表中的下一个联系人“超过”当前的最高分数时才更新它们。
  • 顺便说一句,还有一个简单的改进,您可以在不真正更改算法的情况下对当前解决方案进行改进。目前,您在 findMostSocial() 方法中多次计算 maxLevel()。您只需要这样做一次,将值存储在一个变量中,然后将每个人的分数与它进行比较。

标签: java for-loop arraylist simplify


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多