【问题标题】:Array of type Object, and comparing the objects inside the arrayObject 类型的数组,并比较数组内的对象
【发布时间】:2013-02-07 00:00:35
【问题描述】:

我正在创建一个 Object 类型的数组。我有两个不同的类,Employee 和 Person,它们具有简单的属性,如姓名、薪水(Employee)名字、出生日期(Person)。我需要将一些 Employee 和 Person 对象添加到我的数组中并比较数组中的某些内容。例如,从数组中检索最年轻的人。

public class Driver {

public static void main(String[] args) {
    Employee e1 = new Employee("Den", 2000);

    Employee e2 = new Employee("Jon", 1004);

    Person p1 = new Person("Pen", "Tel", "1993");
    Person p2 = new Person("Jon", "Smith", "1933");

    Object [] crr;
    crr = new Object[4];
    crr[0] = e1;
    crr[1] = p1;
    crr[2] = p2;
    crr[3] = e2;
    System.out.println();
    new Driver().printObjectArray("array crr", crr);

}
public void printObjectArray(String arrayName, Object [] array){
    for (int i = 0; i < array.length; i++){
        System.out.println(arrayName + "["+ i +"]" + array[i].toString());
    }
    System.out.println("--------------------");
}   
}

我将如何比较数组中的某些内容。就像打印最年轻的人一样,这意味着我必须查看数组并查看它是否是 Person 对象,然后在这些对象上获取 DateOfBirth 并打印最年长的人。

【问题讨论】:

  • Employee 是否扩展 Person?通常最好将数组保持为最具体的类型,而不是假设任何元素都属于某个特定的子类。
  • 不,Employee 和 Person 是它们自己的类。
  • 那你为什么要把它们混合成一个数组呢?如果它们没有一些共同的特定属性,那可能不是一个好主意——如果它们确实具有这些共同的属性,他们应该通过扩展一个封装这些方面的通用超类来表达这一点。

标签: java arrays object


【解决方案1】:
public Person getYoungestPerson(Object [] arr){

    int i=0; Person youngest;
    while(person == null){
      if(arr[i] instanceof Person) youngest = arr[i];
      i++;
      }
     for(i=0;i<arr.length;i++){ if (arr[i] instanceof Person) 
            if(arr[i].getDateOfBirth()<youngest.getDateOfBirth()) 
               youngest= arr[i];}
   return youngest;
}

理想情况下,Employee 应该是 Person 的子类,并且您将拥有一个 Person 数组。如果你想要only Persons,你必须小心,因为instanceof也为所有子类返回true,这不是你的情况,因为Employee不扩展Person,只是对未来的提醒.

【讨论】:

    【解决方案2】:

    在您的 Employee 和 Person 类中编写一些 get 方法。例如,

    在您的 Employee 类中,创建:

    public int getSalary(){
      return salary; // Make salary as a global variable
    }
    

    在你的 Person 类中,做

    public int getYear(){
      return year; // same here
    }
    

    所以在你的主代码中,你可以这样做

    for (int i = 1; i < array.length; i++){
      Object youngest;
      if (crr[i].getYear() < crr[i+1].getYear())){
        youngest = crr[i];
      }
    }
    

    但是,我实际上建议您使用 ArrayList 而不是数组。并创建两个数组/ArrayLists,而不是将 e 和 p 放在一个数组中。更易于管理。

    【讨论】:

      【解决方案3】:

      不要使用 Object 类型的数组。 Java 擅长强类型,因此请充分利用这一点。如果 Person 扩展了 Employee,或者 Employee 扩展了 Person,则利用它。用顶级类初始化你的数组:

      Person[] people = {new Employee(...), new Employee(...),
        new Person(...), new Person(...)};
      

      Person[] people;
      ...
      people = new People[]{new Employee(...), 
        new Employee(...), new Person(...), new Person(...)};
      

      Person[] people = new People[<some number>];
      ...
      people[0] = new Employee(...);
      people[1] = new Person(...);
      ...
      

      然后我们可以通过确保 Person(或 Employee)实现 Comparable(或 Employee)、实现 compareTo(Person other) {...}(或 Employee)并调用 Arrays.sort(people) 来对数组进行排序。因为我们使它们具有可比性,Java 将know 如何对它们进行排序。

      Java 可以为您做很多事情,但您必须遵守它的规则。不使用“对象”容器是其中之一,实现 Comparable 接口是另一个(第三种是在 ArrayList、HashMap 等容器上使用泛型,以便 Java 知道您在其中放入了什么,而不是捕获-所有“对象”)

      【讨论】:

        【解决方案4】:

        如果 Person 不是通过扩展与 Employee “相关”,您可以强制两个类实现相同的接口。创建该接口类型的数组并将 Employee 和 Person 对象放入其中。然后使用接口方法比较 Employee 和 Person 对象。 我认为这里最好的选择是让 Employee 扩展 Person,但是接口可以提供一个不错的选择。

        【讨论】:

          猜你喜欢
          • 2021-04-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多