【问题标题】:Can't use toString() method of object inside ArrayList不能在 ArrayList 中使用对象的 toString() 方法
【发布时间】:2013-04-14 15:21:38
【问题描述】:

我正在尝试使用ArrayList 内部对象的toString() 方法,它打印的是内存地址而不是预期值。我把我的课翻译成英文,如果我忘记了什么,对不起,如果你不明白,请追问。 让我们看看我的代码:

调度类(我禁止了 getter 和 setter):

static Professor professor;
static Room room;
static Classroom classroom;

public String toString() {
        return "Schedule [getProfessor()=" + getProfessor() + ", getRoom()="
                + getRoom() + ", getClassRoom()=" + getClassRoom() + ", getClass()=" + getClass() + ", hashCode()="
                + hashCode() + ", toString()=" + super.toString() + "]";
}

学校

ArrayList<Professor> professor = new ArrayList<Professor>();
ArrayList<Room> room = new ArrayList<Room>();
ArrayList<Classroom> classroom = new ArrayList<Classroom>(); 
public ArrayList<Schedule[][]> sched = new ArrayList<Schedule[][]>();

我正在使用遗传算法(目前我正在学习它,所以我不太了解),这是我的“人口生成器”:

人口

public static void generatePopulation(School school){

        // Shuffle the arraylist for generate a random population
        Collections.shuffle(school.getProfessor());
        Collections.shuffle(school.getClassroom());
        Collections.shuffle(school.getRoom());

        Schedule[][] sched1 = new Schedule[1][1];

        // Generate population (just a little test to see if it works)
        sched1[0][0].addEverything(school.getProfessor().get(0), school.getClassroom().get(0), school.getRoom().get(0));
        school.sched.add(sched);

主要

 (... school and associations created ...)
    Population.generatePopulation(school);
    System.out.println(school.getSched().isEmpty()); // it returns false, that is, isn't empty
    System.out.println(school.getSched().get(0).toString()); 
    // returns "[[Lentidades.Schedule;@40914272" (entidades = name of my package)

那么,为什么我收到的是内存位置而不是预期值? 我想我什么都没有忘记,但是如果您在这段代码中看到一些奇怪的东西,只需发送一个问题,我会解释/粘贴剩余的代码。

【问题讨论】:

  • 实际上并不是每个 SE 的内存地址。是你的对象被序列化为字符串
  • 为什么你的变量是静态的?这几乎肯定是个坏主意。
  • 是的,现在我在我的项目中看到了哈哈哈。已经修复了(:

标签: java arrays multidimensional-array arraylist


【解决方案1】:

您收到Schedules 的array,因此您的toString() 方法永远不会被使用。

查看[[Lentidades.Schedule;@40914272 输出的[[ 部分,这告诉您正在打印二维array

正如@JonSkeet 和@MarounMaroun 指出的那样,打印arrays 的一种简单方法是使用Arrays.toString() 用于一维arrays,或Arrays.deepToString() 用于多维。

【讨论】:

  • 要添加到这里,您可以使用 Arrays.toString 打印数组的内容:docs.oracle.com/javase/1.5.0/docs/api/java/util/…
  • 感谢@Keppil!但我仍然遇到错误。我写道: System.out.println(Arrays.deepToString(school.getSched().get(0)));我收到“[[null]]”。
  • @FernandoPaladini:这意味着填充阵列时出现问题,您只有一个 null 时间表。我的猜测是您应该查看addEverything() 方法以获取线索。
  • 我从 Schedule 类的属性和方法中删除了“静态”类型,现在我收到以下错误:“线程中的异常“main”java.lang.NullPointerException”在此代码中:sched1 [0][0].addEverything(school.getProfessor().get(0), school.getClassroom().get(0), school.getRoom().get(0));
  • @FernandoPaladini:该行中有很多可以为空的引用。一个一个地检查它们并确保它们都正确初始化。
猜你喜欢
  • 2012-10-13
  • 2014-05-04
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多