【问题标题】:Basic Object Oriented Programming基本面向对象编程
【发布时间】:2013-10-25 22:41:14
【问题描述】:

我目前正在学习 Java,并被要求编写一个程序来处理 演员和电影作为班级。

演员类具有以下属性:
Name, Address, age, myFilm(一个数组或数组列表,用于保存特定演员的所有电影 已经出演了。

电影类有这些属性:
Name, Code(String, String)

我已经使用 getter 和 setter 方法实现了这些类来处理数据:
到目前为止我的演员班:

public class actor {
    private String name;
    private String address;
    private int age;
    int[] myFilms = new int[3];

     public actor (String name, String address, int age) {
     }


     public void setName (String name) {
          this.name = name;
     }

     public void setAddress (String address) {
          this.address = address;
     }

     public void setAge (int age) {
          this.age = age;
     }

     public void setFilm () {

     }

     public String getName () {
         return name;
     }

     public String getAddress () {
         return address;
     }  
}

我的电影课:

public class film {

    private String name;
    private String code;

    //Constructor
    public film () {

    }

    public void setName (String name) {
        this.name = name;
    }

    public String getName (){
        return name;
    }

    public String getCode (String name) {
        //Get code:
        //Split Function
        String[] words = name.split("\\s+");
        String code = "";
        for (int i=0; i < words.length; i++) {
             code = code + words[i].charAt(0);
             code = code.toUpperCase();
        }
        return code;
    }
}

对于如何使节目动态显示每个演员的总影片,我遇到了难题。这是针对大学分配的,我还需要在某个时候对数组进行深层复制。我对 OO 几乎完全陌生,所以这对我来说是一项棘手的任务。

任何建议或正确方向的观点将不胜感激。

【问题讨论】:

  • 为什么演员myFilmsint的数组?为什么不是film 的数组?
  • 是的,电影数组 (Film[])。还有一个约定,每个类名必须以大写字母开头。
  • ArrayList&lt;Film&gt; 会更好
  • 我会使用 List 而不是数组来保存电影。或者至少是一个 ArrayList。这样,您将每个演员的最大电影数量限制为 3。
  • 更正:是的 myFilm 数组应该是一个字符串。我遇到的麻烦是弄清楚如何让每个演员 myFilm 数组动态显示仅与他们相关的电影标题。

标签: java arrays oop object arraylist


【解决方案1】:

如果你有一个数据库,其中有一个包含用户名和电影(ID)等的表,你可以创建一个如下的类,

Class Film{

private String actorName;

private String filmCode;

private String filmName;

....getter & setter methods
...
}

然后你可以创建一个方法来获取 Film 类的数据列表。 例如:

List<Film> filmList = new ArrayList<Film>();
String actorName = "Arnold";
filmList = dbCon.getFilmListByActor(actorName);

你的 getFilmListByActor 方法应该是这样的,

public List<Film> getFilmListByActor(String actorName){

List<Film> filmList = new ArrayList<Film>();
//Query for get film list by actor
 //assigne filmList to result set
enter code here
 return filmList; 

}

【讨论】:

    【解决方案2】:

    考虑将“在电影中扮演的演员”提取到另一个类,将电影与演员分离(演员也可以做剧院眼镜、配音等,而不是专门的电影。)

    class ActorRole {
       private Actor actor;
       private Movie movie;
       private int dollarsSallary;
       private int scenesPlayed;
       // etc.
    }
    

    如果您不想这样做,我几乎可以肯定创建从电影到演员的依赖关系比从演员到电影更好,因为电影几乎肯定有演员:

    class Movie {
      private List<Actor> actors = new ArrayList<Actor>();
    }
    

    这使得计算演员统计数据变得更加困难(您必须遍历所有电影),但我认为这是一个更好的设计。

    计算单人表演:

    for ( Movie movie : listOfAllMovies ) {
       if ( movie.getActors().contains( myActor ) ) { // read about equals() in Java !
         timesPlayed++;
       }
    }
    

    如果您想为更多演员进行排名,您可以使用Map&lt;Actor,Integer&gt; 将演员映射到他们的出场次数计数器。

    这可能是一个冗长的操作,因此您可以考虑兑现结果(如上图) - 解决方案可以是地图、ActorStatistics 类、actor 中的简单 timesPlayed 字段等。

    不要害怕反对

    不要费力地将电影映射到 id(例如您的 id,它可能与您的电影代码 String 相关联,这会增加另一个类型不兼容的问题。 尝试使用更多对象引用而不是变通方法,并使用List 而不是数组。

    一般来说,阅读 Java 中的 Collections,例如 ArrayListHashMap 以及覆盖 equals()hashCode(),以及一般的 OOP Single responsibility principleClass cohesion

    【讨论】:

    • 我同意电影和演员之间最好有依赖关系;毕竟,如果一个演员在另一部电影中演出,从领域的角度来看,这实际上并没有改变他。但是,Actor 类没有充分的理由);照原样,它只是一个简单的Person 。然后,您可以重用该类来为电影添加更多团队成员,例如制片人、音乐家等。
    【解决方案3】:

    关于你的课程的两个 cmets...

    1. 为什么不这样宣布演员的电影:

      private List&lt;Film&gt; myFilms = new ArrayList&lt;Film&gt;();

      这样,您将能够动态地从您的演员对象中添加和删除电影对象引用。例如,您可以为列表实现 getter 和 setter 并从外部对其进行操作。列表(或一般的集合)比原始数组更容易操作。

    2. 考虑用第一个大写字母声明类,这是一种约定。例如:ActorFilm

    【讨论】:

    • “关于你的课程的两个comments”。
    • 感谢 Martin 的回复,arrayList 是私有的,但不允许我从主类访问它吗?我需要将演员类中的电影数组中的演员电影复制到主要的1个数组中。
    • @AnonOmus 您通过公共方法访问它。例如,addFilm 可以是公共的(可从 main 调用),然后将一个项目添加到电影列表中。您还可以拥有一个公共getFilms,它返回列表(或它的副本)。与删除膜相同。在 Java 中,我们通常通过方法访问所有内容。 object.field = value 几乎永远不会完成。
    • 如果您声明 getter/setter 方法,您可以从外部访问列表,并且您可以从列表中添加/删除元素而无需担心(只要您不执行任何多线程操作,但我想这是不属于你的任务)...
    【解决方案4】:

    您可以在class actor 中编写一个自增容器,例如vector ArrayList 等等。或者你可以自己实现一个动态数组。

    【讨论】:

    • 为什么会有人自己实现动态数组?迄今为止,几乎所有需要的实现都已提供。
    猜你喜欢
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    相关资源
    最近更新 更多